为什么用户控件类访问不能从另一个线程安全?

时间:2010-11-11 14:45:15

标签: c# winforms

正如标题所说,为什么用户控件类访问不能从另一个线程安全?我听说有一种方法可以启用跨线程访问,并且我正在考虑这样做。有人想过为什么我不应该这样做?

3 个答案:

答案 0 :(得分:7)

看看这个:

http://msdn.microsoft.com/en-us/library/ms171728.aspx

  

访问Windows窗体控件是   本质上不是线程安全的。如果你   有两个或多个线程操纵   控制的状态,是可能的   迫使控制进入   不一致的状态。其他   线程相关的错误是可能的,例如   作为竞争条件和僵局。它   确保访问权限非常重要   你的控件是在一个   线程安全的方式。

答案 1 :(得分:3)

UserControl实例与“UI线程”具有线程关联性,当您尝试从潜在的工作线程移动到UI线程时,它将需要来回编组。

此外,线程安全组件完全不同,因为例如,如果跨多个线程共享单个UserControl实例,则需要同步所有成员变量,因此也可能被访问。

可以这样做吗?理论上是的......应该这样做吗?不必要。我会重新审视您的设计并质疑您在UserControl中需要此行为的原因。关注点的分离应该浮出水面,也许你可以从UserControl中获得耗时的任务,从而减轻你的负担。

答案 2 :(得分:3)

允许从另一个线程(即,未在其上创建的线程)访问WinForms控件可能导致死锁和竞争条件。两个同时运行的线程,都试图更新相同的控件,可能最终等待彼此完成,然后才能执行任何操作。 (参见MSDN。)WinForms保护您免受这些隐藏的错误。

如果需要,您可以使用BeginInvoke方法轻松地指示您希望它控制的线程更新控件并将其传递给委托:

myUserControl.BeginInvoke(myUserControl.PaintItBlack);

这将在创建控件的线程上异步执行指定的委托,从而确保安全访问。