作者wvsrugby (wvsrugby)
看板C_Sharp
标题Re: [心得] delegate();之心得
时间Sun Dec 21 02:24:57 2008
MSDN 中有绝妙的范例,
先判断 Control.InvokeRequired,
再决定是否需要去 invoke delegate,
不然只是浪费系统资源.
public void UpdateStatus(object obj)
{
if (this.InvokeRequired)
{
this.Invoke(new Action<object>(UpdateStatus), obj);
return;
}
FileInfo fileInfo = obj as FileInfo;
if (fileInfo != null)
{
//...
return;
}
this.label1.Text = obj.ToString();
}
※ 引述《starlife672 (我爱秋爱我)》之铭言:
: 小弟是c#爱用者
: 在开发过程中,往往参杂着多个执行绪在使用
: 我从VS 1.1开始用到现在也只停留在2.0阶段
: 没有想使用3.5的慾望@@
: 因为小弟是从java阵营跳槽支持c#的(真他妈的好丫)
: 我相信在执行绪中操作控制项上的内容一定死一堆人
: 一定常出现这种状况
: =============================================
: System.InvalidOperationException 未处理
: 跨执行绪作业无效: 存取控制项 'tbStatus'
: 时所使用的执行绪与建立控制项的执行绪不同。"
: ==============================================
: 看到这个就相当的火大, 明明在vs 1.1中根本就没事
: 原本的程式换到了2.0上就死掉了
: 更何况又是很急很急的专案呢~
: 後来去拜见辜狗大神,原来只要加上这个就没事了
: Control.CheckForIllegalCrossThreadCalls=false; (方法一)
: 真的很讨厌,在java也都没事,在2.0上就死掉
: 後来开发到後期,对工具的使用也熟悉到一个阶段了
: 开始尝试比较正规的作法,就是委派事件delegate
: =============================================
: //(1).设定好委派事件
: private delegate void ControlDelegate(string id,object obj);
: //(2).设定好让Thread要叫用的方法
: public SetStatus(string id,object obj){
: this.invoke(new ContrlDelegate(this.SetStatusDelegate),
: new object[]{id,obj});
: }
: //(3).真正执行方法的地方
: private SetStatusDelegate(string id,object obj){
: if(id.Equals("Message")){
: this.label1.Text = (string)obj;
: }
: else if(id.Equals("FileInfo")){
: FileInfo info = (FileInfo)obj;
: }
: }
: 到时候我只要在Thread中,透过SetStatus("Message","Starlife是帅哥");
: 就ok了
: =============================================
: 这个方法是自己领悟出来的,真神奇有这种方法
: 无法是从Socket哪丢来的讯息,或是从硬体设备丢出来的讯息
: 都可以透过SetStatus的方式去使用,个人蛮prefer这种正规做法
: 不过写到後面真的会想偷懒,因为要一直去定义一堆有的没有的id
: 很烦的,於是开始爱上匿名方法,也就是
: ============================================
: private delegate void ControlDelegate();
: this.invoke(new ControlDelegate(delegate(){
: //Do Something
: }));
: 又简短又有力
: ============================================
: 打完收功,以上只是小弟的小小心得
: 如果有更好的方法,也请诸位大大能不吝请教指点一番
: (好吧我承认我来赚文章数和p币的)
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.161.33.38
1F:推 leicheong:这才是正确的做法. 想在其他的thread不透过invoke控制 12/21 08:26
2F:→ leicheong:UI thread的话, 只会产生一些不常出现而且非常难 12/21 08:27
3F:→ leicheong:reproduce的bug... 12/21 08:27
4F:推 mtm:msdn价好用~~~ 12/22 09:30