怎么使用Invoke函数

时间:浏览436次 发布人:m19600911

怎么使用Invoke函数

已解决问题

谷歌m19600911用户在浏览436次提交了关于“葫芦娃怎么使用Invoke函数”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-08-22T01:14:18。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !

希望以下的回答,能够帮助你。

第1个回答

用户名:s**n5516950  

在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke和BeginInvoke就是为了解决这个问题而出现的,使你在多叶龙火输即升仍线程中安全的更新界面显示。

正确的做法是将工问答作线程中涉及更新界置用传能面坐收名世伯面的代码封装为一个方法,通过Invoke或者BeginInvoke
去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态

,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往会想当然地这么写:

voidBut政tonOnClick(objectsender,EventArgse)

{

button.Text="关闭";

}

这样的写法运行程序之后,可能会触发异常,异常信息大致是“不能从不是创建该控件的线程调用它”。注意这里是“可能”,并不一定会触发该种异常。造
成这种异常的原因在于,控件是在主线程中创建的(比如this.Controls.Add();),进入控件的事件响应函数时,是在控件所在的线

程,并不是主线程。在控件的事件响应函数中改变控件的状态,可能与主线程发生线程冲突。如果主线程正在林视把客座项办听引想移重绘控件外观,此时在别的线程改变控件外观,就会造
成画面混乱。不过这样的情况并不总会发生,如果主线程此时在重绘别的控件,就可能逃过一劫,这样的写法可以正常通过,没有触发异常。

正确的写法是在控件响应函数中调用控件的Invoke方法(其实如果大家以前用过C++

Builder的话,也呢须损武座会找到类似Invoke那样的激活到主线程的函数)。Invoke方法会顺着控件树向上搜索,直到找到创建控件的那个线程(通常是主线程)酒觉质造弦久定力武凯火,然后进入那个线程改变控件的外观,确保不发生线程冲突。

而所谓的“一面响应操作,一面添加节点”草凯黑斗或象造利确久裂永远只能是相对的,使UI线程的负担不至于太大而已,因为界面的正确更新始终要通过UI
线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到UI线程中去做,这样也就达到了减轻UI
线程负担的目的了。

举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体力占景宣心杆而必开中的一个TextB许育论任候社ox..

usin静都滑例gSystem.Threading;

//启巴落动一个线程
Threadth帝触你众灯富围明面汽浓read=newThread(new
Threa修类散岁主述在普dStart(DoWork));
thread.Start();

//线程方法
privatevoidDoWork()
{
this.TextBox1.Text="我是一个文本框";
}

如果你像上面操作,在VS2005或2008里是会有异常的

正确的做法是用Invoke\BeginInvoke

usingSystem.Threadin城和去础山判亚毛小浓g;
namespacetest
{
publicpartialclassForm1:Form
{
publicdelegatevoidMyInvoke(stringstr1,stringstr2);
pu卫画现在血报待担每坐blicForm1()
{
InitializeComponent();

}
p乎白院孙球ublicvoidDoWork(止弱封区末居)
{
MyInvokemi=newMyInvoke(UpdateForm);
this.BeginInvoke(mi,newObject[]{"我是文本框","haha"});
}
publicvoidUpdateForm(stringparam1,stringparm2)
{
this.textBox1.Text=param1+parm2;
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
Threadthread=newThread(newThreadStart(DoWork));
thread.Start();
}
}
}
注意**的使用!

标签:Invoke