gpt4 book ai didi

c# - Winforms UI 无响应查询

转载 作者:行者123 更新时间:2023-11-30 16:31:01 27 4
gpt4 key购买 nike

我有一个 UI,其中有一个 BackgroundWorker

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

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

  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.
    }

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

谢谢。

最佳答案

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

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

// UI updates here

通过调用行,您的后台工作人员被迫等待 UI 操作完成,因此如果出现其他一些操作并试图结束后台工作人员,UI 可能会挂起,因为:

  1. 后台工作人员正在等待 UI 完成(因为调用)
  2. UI 线程上的某些事情要求后台 worker 完成
  3. 由于 UI 正在等待后台 worker,而后台 worker 正在等待 UI,所以你挂了

最简单的解决方案是使用 BeginInvoke,它只会“排队”您的 UI 操作,而不会阻止您的后台工作人员执行其工作。

-- 丹

关于c# - Winforms UI 无响应查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5137257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com