我有一个用户界面,BackgroundWorker
。
BackgroundWorker
正在运行时,它会通过编组方式更新用户界面。在其中一次运行期间,UI没有响应。我点击了Visual Studio中的暂停按钮,看看发生了什么。
以下行显示在Threads窗口中运行:
Application.Run(new uxRunSetup());
private delegate void DisplayCounterHandler(int[] counts, int total);
private void DisplayCounter(int[] counts, int total)
{
if (InvokeRequired)
{
//stuck on Invoke below.
Invoke(new DisplayCounterHandler(DisplayCounter), counts, total);
return;
}
//some UI updates here.
}
我一直在阅读this帖子。我的问题是,假设已拨打DisplayCounterHandler
。但是,BackgroundWorker已经完成。这会导致用户界面无响应并崩溃吗?
感谢。
答案 0 :(得分:3)
您应该将您的Invoke切换为BeginInvoke,即
if(this.InvokeRequired)
{
this.BeginInvoke(...);
return;
}
// UI updates here
使用您的调用行,您的后台工作程序将被迫等待UI操作完成,因此如果出现其他一些操作并尝试结束后台工作程序,则UI可能会挂起,因为:
最简单的解决方案是使用BeginInvoke,它只是简单地“排队”您的UI操作,而不是阻止后台工作者完成其工作。
- 丹