C# 为什么不是';t用户控制类访问不安全吗?

C# 为什么不是';t用户控制类访问不安全吗?,c#,winforms,C#,Winforms,正如标题所说,为什么用户控件类访问在另一个线程中不安全?我听说有一种方法可以实现跨线程访问,我正在考虑这样做。。有没有想过为什么我不应该这样做?看看这个: 无法访问Windows窗体控件 不是天生的线程安全。如果你 有两个或多个线程 控件的状态,这是可能的 强制控件进入一个 不一致状态。其他 可能存在与线程相关的错误,例如 作为竞争条件和死锁。信息技术 确保访问 对控件的访问是在 线程安全方式 UserControl实例与“UI线程”具有线程亲缘关系,当您尝试从潜在工作线程移动到UI线程时,需

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

看看这个:

无法访问Windows窗体控件 不是天生的线程安全。如果你 有两个或多个线程 控件的状态,这是可能的 强制控件进入一个 不一致状态。其他 可能存在与线程相关的错误,例如 作为竞争条件和死锁。信息技术 确保访问 对控件的访问是在 线程安全方式


UserControl实例与“UI线程”具有线程亲缘关系,当您尝试从潜在工作线程移动到UI线程时,需要来回封送

此外,线程安全组件是完全不同的,因为如果单个UserControl实例在多个线程之间共享,那么所有成员变量(例如实例)都需要同步,因此也可能被访问


这能做到吗?理论上是的……应该这样做吗?不一定。我将重新审视您的设计,并询问您为什么需要UserControl中的这种行为。关注点分离应该浮出水面,也许您可以将耗时的任务从UserControl中移除,从而减轻您的负担。

允许从另一个线程(即未创建WinForms控件的线程)访问WinForms控件可能会导致死锁和争用情况。同时运行的两个线程,都试图更新同一个控件,最终可能会在它们能够做任何事情之前等待对方完成。(请参阅。)WinForms保护您免受这些隐藏的bug的攻击

如果需要,可以很容易地指示控件的线程希望它使用该方法更新控件并向其传递委托:

myUserControl.BeginInvoke(myUserControl.PaintItBlack);
这将在创建控件的线程上异步执行指定的委托,以确保安全访问