C# invoke,BeginInvoke,EndInvoke
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 時返回。
在多線程編程中,我們經常要在工作線程中去更新界面顯示,而在多線程中直接調用界面控件的方法是錯誤的做法,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 時返回。
posted on 2016-09-08 10:16 天下 閱讀(1063) 評論(0) 編輯 收藏 引用 所屬分類: C#

