如何使用户控件在自己的线程上运行

时间:2009-07-18 19:14:49

标签: c# winforms multithreading user-controls

如何让用户控件在自己的线程上运行?

e.g。通过在用户控件中跟随代码,coz用户控件使用主应用程序线程使主线程休眠

Thread.Sleep(TimeSpan.FromMinutes(2));

2 个答案:

答案 0 :(得分:3)

用户控件需要在UI线程上运行,因为这是Windows API中的限制。如果您尝试使用另一个线程中的Windows窗体控件,则会出现异常。

您可以在另一个线程中运行其他代码,但使用UI线程更新控件。您可以使用BackgroundWorker进行此操作。或者您可以使用控件实例上的InvokeRequired和Invoke或BeginInvoke方法让它在UI线程上执行代码。


您提到要使用互斥锁。互斥锁是为了避免多个线程同时访问资源。如果您的所有代码都在同一个线程中运行,那么您根本不需要锁定。

答案 1 :(得分:2)

对象本身并没有真正“运行” - 方法在线程上执行。

现在,如果您希望在不同的线程中执行特定方法,则需要创建新线程,显式使用线程池,或者使用为您使用线程池的内容 - 例如BackgroundWorker。< / p>

当你想睡两分钟时,你在做什么?您是否可以通过在两分钟内设置定时器(在UI线程中)来避免睡眠?如果这是一个长时间运行的进程的一部分,你应该使用BackgroundWorker或其他一些在不同线程上执行的方式,但控件本身仍然处理UI线程上的更新和事件。