看了些博客,感觉还是没说清楚,下面说说自己的理解。
在多线程环境下是不允许跨线程修改主线程上窗口控件的,所以在子线程中对控件进行修改应该使用控件的Invoke方法,Invoke方法的定义是在拥有此控件的基础窗口句柄的线程上执行指定的委托。也就是说它会自动寻找创建该控件的线程(一般是主线程),然后在该线程上执行委托里的方法,这就避免了多线程同时操作同一控件,使其状态不确定。窗体本身也具有这个方法,所以如果怕麻烦的话,可以统一用this.Invoke。
言归正传,先贴上一个正确的代码:
delegate void ShowMessageDelegate(string mes);
private void show(string mes)
{
richTextBox1.AppendText(mes);
}
internal void ShowMessage(string message)
{
ShowMessageDelegate deg = show;
richTextBox1.Invoke(deg, message);
}
使用Lam

本文探讨了在多线程环境下,由于跨线程修改主线程窗口控件的限制,需要使用Invoke方法。解释了Invoke的工作原理,即在控件创建线程上执行委托内的方法,避免并发问题。文章指出,原始代码通过声明委托类型、创建方法和实例化委托的方式显得冗余。作者通过示例代码说明,直接使用Lambda表达式创建匿名方法和委托实例时,由于缺乏明确的委托类型定义,导致编译错误。解决方案是使用内置委托如Action或Func。

1632

被折叠的 条评论
为什么被折叠?



