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 + "\r\n");
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 + "\r\n");
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);
}
}
}
歡迎大家提建議,如果那里有問題還請指教一下
