【问题标题】:"Block" UI Thread till Backgroundworker finished“阻止” UI 线程,直到 Backgroundworker 完成
【发布时间】:2016-07-13 17:47:53
【问题描述】:

我有一个后台工作人员,我想在工作人员完成之前显示加载 gif。

我的问题是我无法使用

while(worker.IsBusy)
    Thread.Sleep(50);

因为这会阻止 UI 线程和我的 GIF 更新它的帧。

使用 AutoResetEventmyAutoResetEvent.WaitOne();

时会出现同样的问题

您知道如何等待 Backgroundworker 完成并仍然能够显示 GIF 吗?

【问题讨论】:

  • 如果你想等到加载结束,为什么要使用 BackgroundWorker?
  • 使用 BackgroundWorker 的全部目的是防止 UI 阻塞。你到底为什么要故意引起后台线程旨在防止的问题?你需要重新考虑这个问题,因为启动一个线程来防止阻塞然后故意阻塞是不合适的设计。
  • 使用 BackgroundWorker 因为我想在代码执行时显示加载中的 GIF。如果我不使用 BackgroundWorker 进行工作,UI 将冻结并显示不加载 GIF。但我希望在 Worker 工作时显示这个 gif。
  • 您可以让您的后台工作人员设置一个属性,您的 UI 的部分绑定到该属性以知道大部分 UI 应该被禁用,并且您还可以使用该属性来知道何时在另一个中显示 GIF任务/后台工作人员。这样,后台工作人员正在做一些事情,但您的窗口不会在显示 GIF 时冻结。
  • 不要在问题中编辑答案。

标签: c# multithreading backgroundworker gif


【解决方案1】:

BackgroundWorker 的全部意义在于允许 UI 继续运行。

而且,您特别希望 GIF 继续更新,BackgroundWorker 正在运行。

所以这是一个完美的解决方案。

不过,很明显,您希望 UI 在 BackgroundWorker 运行时是“非迭代的”。嗯,有一个相当基本的方法来做到这一点。

这里是:

    private void SaveButton_Click(object sender, EventArgs e)
    {
        SaveButton.Enabled = false;
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(5000);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        SaveButton.Enabled = true;
    }

基本上,您只需禁用不想让用户与之交互的控件,然后在完成BackgroundWorker 后重新启用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    相关资源
    最近更新 更多