如何让用户控件在自己的线程上运行?
e.g。通过在用户控件中跟随代码,coz用户控件使用主应用程序线程使主线程休眠
Thread.Sleep(TimeSpan.FromMinutes(2));
答案 0 :(得分:3)
用户控件需要在UI线程上运行,因为这是Windows API中的限制。如果您尝试使用另一个线程中的Windows窗体控件,则会出现异常。
您可以在另一个线程中运行其他代码,但使用UI线程更新控件。您可以使用BackgroundWorker进行此操作。或者您可以使用控件实例上的InvokeRequired和Invoke或BeginInvoke方法让它在UI线程上执行代码。
您提到要使用互斥锁。互斥锁是为了避免多个线程同时访问资源。如果您的所有代码都在同一个线程中运行,那么您根本不需要锁定。
答案 1 :(得分:2)
对象本身并没有真正“运行” - 方法在线程上执行。
现在,如果您希望在不同的线程中执行特定方法,则需要创建新线程,显式使用线程池,或者使用为您使用线程池的内容 - 例如BackgroundWorker
。< / p>
当你想睡两分钟时,你在做什么?您是否可以通过在两分钟内设置定时器(在UI线程中)来避免睡眠?如果这是一个长时间运行的进程的一部分,你应该使用BackgroundWorker
或其他一些在不同线程上执行的方式,但控件本身仍然处理UI线程上的更新和事件。