正如标题所说,为什么用户控件类访问不能从另一个线程安全?我听说有一种方法可以启用跨线程访问,并且我正在考虑这样做。有人想过为什么我不应该这样做?
答案 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);
这将在创建控件的线程上异步执行指定的委托,从而确保安全访问。