我在我的 Windows 窗体应用程序中使用线程。
代码
Thread sqlProcessThread = new Thread(new ThreadStart(doSqlWork));
sqlProcessThread.IsBackground = true;
sqlProcessThread.Start();
每当从我的表单中调用此线程时,表单就会挂起。在不使用后台工作人员的情况下如何解决这个问题。
我在我的 Windows 窗体应用程序中使用线程。
Thread sqlProcessThread = new Thread(new ThreadStart(doSqlWork));
sqlProcessThread.IsBackground = true;
sqlProcessThread.Start();
每当从我的表单中调用此线程时,表单就会挂起。在不使用后台工作人员的情况下如何解决这个问题。
您可以使用属性 InvokeRequired 来检查来自不同线程的 UI 访问。
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(this.updateUI));
return;
}
更多信息:MSDN 文档
如果您Invoke()
从后台线程使用,它将等待 UI 响应,然后再继续。
Invoke()
UI 可以通过等待需要后台线程进行进一步处理的东西来响应调用。如果发生这种情况,你就会陷入僵局。
如果您不需要UI调用的返回值,您通常可以通过使用BeginInvoke()
而不是Invoke()
.
调用BeginInvoke()
将立即返回调用它的后台线程,防止死锁。
这必须小心使用。