Winforms UI无响应查询

时间:2011-02-28 00:59:42

标签: c# winforms .net-3.5

我有一个用户界面,BackgroundWorker

BackgroundWorker正在运行时,它会通过编组方式更新用户界面。在其中一次运行期间,UI没有响应。我点击了Visual Studio中的暂停按钮,看看发生了什么。

以下行显示在Threads窗口中运行:

  1. Application.Run(new uxRunSetup());

  2. 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.  
    }  
    
  3. 我一直在阅读this帖子。我的问题是,假设已拨打DisplayCounterHandler。但是,BackgroundWorker已经完成。这会导致用户界面无响应并崩溃吗?

    感谢。

1 个答案:

答案 0 :(得分:3)

您应该将您的Invoke切换为BeginInvoke,即

if(this.InvokeRequired)
{
  this.BeginInvoke(...);
  return;
}

// UI updates here

使用您的调用行,您的后台工作程序将被迫等待UI操作完成,因此如果出现其他一些操作并尝试结束后台工作程序,则UI可能会挂起,因为:

  1. 后台工作者正在等待UI完成(因为调用)
  2. UI线程上的某些内容要求后台工作者完成
  3. 由于UI正在等待后台工作程序,并且后台工作程序正在等待用户界面,因此您已挂起
  4. 最简单的解决方案是使用BeginInvoke,它只是简单地“排队”您的UI操作,而不是阻止后台工作者完成其工作。

    - 丹