• BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题


    BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题

    原文:http://www.sufeinet.com/thread-3707-1-1.html
         大家可以先看看我上次写的文章

    http://www.sufeinet.com/thread-3556-1-1.html
    在这个例子中只是使用委托,在子线程中设置主线程的数据,而没有说明怎么样取返回值,
    当今天有一个用户在问这个问题时我感觉应该写一下了
    其实这个很简单先看下面界面

    这是怎么实现的呢其实
    很简单
    第一步定义一个委托

    //创建一个委托,是为访问TextBox控件服务的。
            public delegate string UpdateTxt(string msg);
            //定义一个委托变量
            public UpdateTxt updateTxt;
    

     第二步是实例化一下

     private void Form1_Load_1(object sender, EventArgs e)
            {
                //实例化委托
                updateTxt = new UpdateTxt(UpdateTxtMethod);
            }

    指定的UpdateTxtMethod该当如下显示

     //修改TextBox值的方法。
            public string UpdateTxtMethod(string msg)
            {
                richTextBox1.AppendText(msg + "
    ");
                return msg;
            }
    

     这个主要是用来设置richTextBox1的值的。

    第三步开启一个线程

     //开启线程
            private void button1_Click(object sender, EventArgs e)
            {
                Thread objThread = new Thread(new ThreadStart(delegate
                {
                    ThreadMethodTxt(textBox1.Text.Trim());
                }));
                objThread.Start();
            }
    

     线程主要是用来执行这个方法的ThreadMethodTxt

    这个方法代码如下

        //此为在非创建线程中的调用方法,其实是使用TextBox的Invoke方法。
            public void ThreadMethodTxt(string n)
            {
                IAsyncResult ar = this.BeginInvoke(updateTxt, n);
                //这里就是你要的返回数据
                string result = this.EndInvoke(ar).ToString();
    
                this.BeginInvoke(updateTxt, "返回数据:" + result);
            }
    

    其实就是这两句

     IAsyncResult ar = this.BeginInvoke(updateTxt, n);
                //这里就是你要的返回数据
                string result = this.EndInvoke(ar).ToString();

    这样就可以取到返回的数据了this.EndInvoke(ar)返回的是一个对象,如是其它类型大家可以使用Convert进行相应的转化就行了。

    下面是全部代码大家看看吧

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            //创建一个委托,是为访问TextBox控件服务的。
            public delegate string UpdateTxt(string msg);
            //定义一个委托变量
            public UpdateTxt updateTxt;
    
            //修改TextBox值的方法。
            public string UpdateTxtMethod(string msg)
            {
                richTextBox1.AppendText(msg + "
    ");
                return msg;
            }
    
            //此为在非创建线程中的调用方法,其实是使用TextBox的Invoke方法。
            public void ThreadMethodTxt(string n)
            {
                IAsyncResult ar = this.BeginInvoke(updateTxt, n);
                //这里就是你要的返回数据
                string result = this.EndInvoke(ar).ToString();
    
                this.BeginInvoke(updateTxt, "返回数据:" + result);
            }
            //开启线程
            private void button1_Click(object sender, EventArgs e)
            {
                Thread objThread = new Thread(new ThreadStart(delegate
                {
                    ThreadMethodTxt(textBox1.Text.Trim());
                }));
                objThread.Start();
            }
    
            private void Form1_Load_1(object sender, EventArgs e)
            {
                //实例化委托
                updateTxt = new UpdateTxt(UpdateTxtMethod);
            }
        }
    }
    

    欢迎大家提建议,如果那里有问题还请指教一下

  • 相关阅读:
    bat常用指令记录
    物料主数据MM01扩充时默认值的设置 BADI_MATERIAL_REF
    CK11,CK11N 成本估算数据读取
    VUE中具名插槽和匿名插槽的使用
    VUE+element页面按钮调用dialog
    线程进程随笔
    "反直觉" 的Unity粒子系统API
    一个RingBuffer(C语言)
    一个极其简单(陋)的内存分配器
    nginx 转发接口出现 403 forbidden
  • 原文地址:https://www.cnblogs.com/sufei/p/3140557.html
Copyright © 2020-2023  润新知