天下发表于
2016-09-08 02:16:00
C# invoke,BeginInvoke,EndInvoke
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..
using System.Threading;
//启动一个线程
Thread thread=new Thread(new ThreadStart(DoWork));
thread.Start();
//线程方法
private void DoWork()
{
this.TextBox1.Text="我是一个文本框";
}
如果你像上面操作,在VS2005或2008里是会有异常的
正确的做法是用Invoke\BeginInvoke
using System.Threading;
namespace test
{
public partial class Form1 : Form
{
public delegate void MyInvoke(string str1,string str2);
public Form1()
{
InitializeComponent();
}
public void DoWork()
{
MyInvoke mi = new MyInvoke(UpdateForm);
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
}
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
}
}
相关资料:Invoke 和 BeginInvoke 的真正涵义 、在多线程中如何调用Winform
Control.BeginInvoke 方法 Visual Studio 2010Visual Studio 2010
在创建控件的基础句柄所在线程上异步执行委托。
公共方法 BeginInvoke(Delegate) 在创建控件的基础句柄所在线程上异步执行指定委托。
公共方法 BeginInvoke(Delegate,Object[]) 在创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托。
public Object EndInvoke(IAsyncResult asyncResult)
参数:asyncResult 类型:System.IAsyncResult
IAsyncResult,表示特定的调用异步操作,在调用 BeginInvoke 时返回。