C# Winforms UI无响应查询

C# Winforms UI无响应查询,c#,winforms,.net-3.5,C#,Winforms,.net 3.5,我有一个用户界面,里面有一个BackgroundWorker 当BackgroundWorker运行时,它通过编组的方式更新UI。在其中一次运行期间,UI没有响应。我在VisualStudio中点击暂停按钮查看发生了什么 以下行显示为在“线程”窗口中运行: Application.Run(new uxRunSetup()) private delegate void DisplayCounterHandler(int[]计数,int总数) 我一直在通读。我的问题是,假设调用了DisplayCo

我有一个用户界面,里面有一个
BackgroundWorker

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

以下行显示为在“线程”窗口中运行:

  • Application.Run(new uxRunSetup())

  • private delegate void DisplayCounterHandler(int[]计数,int总数)

  • 我一直在通读。我的问题是,假设调用了
    DisplayCounterHandler
    。但是,BackgroundWorker已经完成了。这是否会导致UI无响应和崩溃


    谢谢。

    您应该将调用切换到BeginInvoke,即

    if(this.InvokeRequired)
    {
      this.BeginInvoke(...);
      return;
    }
    
    // UI updates here
    
    在调用行中,后台工作程序被迫等待UI操作部分完成,因此如果出现其他操作并试图结束后台工作程序,UI可能会挂起,因为:

  • 后台工作程序正在等待UI完成(因为调用)
  • UI线程上的某些内容要求后台工作人员完成
  • 因为UI正在后台工作程序上等待,而后台工作程序正在UI上等待,所以挂起了
  • 所以最简单的解决方案是使用BeginInvoke,它将简单地“排队”您的UI操作,而不会阻止您的后台工作人员执行其工作


    --丹

    谢谢你,丹。执行
    BeginInvoke
    是有意义的。我会尝试一下,并随时通知您。@debracey如果您的后台工作线程运行得太快,以至于频繁调用BeginInvoke()操作,会发生什么情况?这也会导致反应迟钝吗?是的。你需要在上面加一些限制器。
    if(this.InvokeRequired)
    {
      this.BeginInvoke(...);
      return;
    }
    
    // UI updates here