C# 怎样在调用控件时做到 Thread-safe(线程安全)

如果你看明白了这段例子,应该就不难理解了。这个例子一共提供了三个处理方式,第一个是不安全的,我们就不用看了。第二个是使用Invoke方法传一个委托进去,分配到UI线程上执行。一般情况下我们都采用这个方法:\t\tprivate void SetText(string text)\t\t{\t\t\t// InvokeRequired required compares the thread ID of the\t\t\t// calling thread to the thread ID of the creating thread.\t\t\t// If these threads are different, it returns true.\t\t\tif (this.textBox1.InvokeRequired)\t\t\t{\t\t\t\t\tSetTextCallback d = new SetTextCallback(SetText);\t\t\t\tthis.Invoke(d, new object { text });\t\t\t}\t\t\telse\t\t\t{\t\t\t\tthis.textBox1.Text = text;\t\t\t}\t\t}将委托用Invoke方法调用,可以将委托中的代码传送到UI线程上安全的执行。在这个委托里面,你可以安全的改变任何控件的状态和值,如果你要传递多个参数,看到那个object了没?当然,也可以直接用闭包的形式传进去。用心看代码,用心写代码。多看多试,这种问题老实说自己试试比来这里提问快多了。
■网友
又找到了一个好方法:this.Invoke(new Action(() =\u0026gt; { this.Text = "xxx"; }));这样设置form元素的东西真是太方便了。。一行代码就可以,什么都不用声明
■网友
C#不清楚。很多GUI toolkit都有一种功能,让回调在控件的那个线程里被执行。
■网友
在控件上直接用Invoke就会在控件创建的线程执行,安全……请注意,在Form_Load阶段的控件invoke存在风险,请先让其show……血泪坑,我的日志子系统……


    推荐阅读