作者starlife672 (我爱秋爱我)
看板C_Sharp
标题[心得] delegate();之心得
时间Sat Dec 20 05:41:52 2008
小弟是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: 163.17.9.234
1F:推 ilovebbs:好文推!!!一直都不知道怎麽用.囧 12/20 19:34
2F:推 tomex:其实只要事先读好理论,这些领悟自然在.net 1.1->3.5都有教 12/26 22:36