日期:2014-05-18  浏览次数:20778 次

为什么委托可以跨线程使用
我写了一个这样的程序,一直不明天委托的原理。(只知道就是委托别人做事)

  System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ThreadStart(Do));
  th.IsBackground = true;
  th.Start();

开启了一个这样的线程,
在线程中我操作了另外一个窗体, 然后就报错。"线程间操作无效"
刚才找了下资料,原因就是 开启的线程不能操作其他同线程中的控件。

但是好像加上 invoke方法.... 就行了。
这是为什么啊? 请高手指教,特发此贴讨论

------解决方案--------------------
要了解Invoke()方法,首先要了解什么是委托。
委托可以用于跨线程的已知方法调用,但是必须已经明确知道这个方法的声明。

这么说吧,比如C和C++当中的指针。
你可以把委托理解成一种在C#中可以使用的特殊的指针,你可以使用委托来指向某一个方法,让这个方法可以供你当前的线程调用。
但是要使用这个指针,你必须明确知道指向方法的声明。就是你必须知道方法的返回值,参数个数,和参数类型。

而Control.Invoke(delegate)和Control.Invoke(delegate, object[])这两个方法,就是利用委托,让你在拥有控件的基础窗口句柄的线程上,用(参数列表)执行委托。

这么说你明白了吗?
------解决方案--------------------
默认情况下,控件只能在创建他的线程上操作,这是为了避免多线程编程的复杂性破坏控件状态,通过 invoke 方法,可以将调用指派给正确的线程。可以将 Control.CheckForIllegalCrossThreadCalls 设为 false 来允许其它线程操作控件,不过这么做出了问题不好跟踪
------解决方案--------------------
不喜欢结贴的程序员,不是好程序员。

就像,malloc 了, 却从不去 free。

open/create 了 handle, 却从不去 close handle。