【转】C#中Invoke的用法
在多線程編程中,我們經(jīng)常要在工作線程中去更新界面顯示,而在多線程中直接調(diào)用界面控件的方法是錯(cuò)誤的做法,Invoke 和 BeginInvoke 就是為了解決這個(gè)問(wèn)題而出現(xiàn)的,使你在多線程中安全的更新界面顯示。
正確的做法是將工作線程中涉及更新界面的代碼封裝為一個(gè)方法,通過(guò) Invoke 或者 BeginInvoke 去調(diào)用,兩者的區(qū)別就是一個(gè)導(dǎo)致工作線程等待,而另外一個(gè)則不會(huì)。
而所謂的“一面響應(yīng)操作,一面添加節(jié)點(diǎn)”永遠(yuǎn)只能是相對(duì)的,使 UI 線程的負(fù)擔(dān)不至于太大而已,因?yàn)榻缑娴恼_更新始終要通過(guò) UI 線程去做,我們要做的事情是在工作線程中包攬大部分的運(yùn)算,而將對(duì)純粹的界面更新放到 UI 線程中去做,這樣也就達(dá)到了減輕 UI 線程負(fù)擔(dān)的目的了。
舉個(gè)簡(jiǎn)單例子說(shuō)明下使用方法,比如你在啟動(dòng)一個(gè)線程,在線程的方法中想更新窗體中的一個(gè)TextBox..?
using System.Threading;?
//啟動(dòng)一個(gè)線程?
Thread thread=new Thread(new ThreadStart(DoWork));?
thread.Start();?
//線程方法?
private void DoWork()?
{?
this.TextBox1.Text="我是一個(gè)文本框";?
}?
如果你像上面操作,在VS2005或2008里是會(huì)有異常的...?
正確的做法是用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();
}
}
}
注意代理的使用!
轉(zhuǎn)載于:https://www.cnblogs.com/hahawgp/archive/2013/05/14/3077940.html
總結(jié)
以上是生活随笔為你收集整理的【转】C#中Invoke的用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python爬虫做灰产_python爬虫
- 下一篇: c# char unsigned_dll