【问题标题】:Implement responsive gui with sleep without backgroundworker在没有后台工作人员的情况下实现具有睡眠的响应式 gui
【发布时间】:2015-08-09 11:52:55
【问题描述】:

我有这段代码,它包含一个睡眠。尽管 Invoke,但 Gui 的反应并不好。当我使用 backgroundWorker 进行操作时,Gui 反应良好。 这只能通过 backgroundWorker 来完成吗?如果是,那为什么。

谢谢。

    private void button1_Click(object sender, EventArgs e)
    {
        ThreadPool.QueueUserWorkItem((_) => F());
    }
    private void F()
    {
        for (int i = 0; i < 10; i++)
           label1.Invoke(new MethodInvoker(HardWork));
    }

    private void HardWork()
    {
        label1.Text += "x";
        Thread.Sleep(300);
    }

【问题讨论】:

  • 调用正是它响应不佳的原因。它使代码在 UI 线程上运行。是否有理由不使用BackgroundWorker 或只是出于好奇?
  • 如果您在主线程上调用 sleep(ms),应用程序将变得无响应。在 C# 中有多种处理线程的方法。 Async Await、Background worker、“Native thread”等
  • 但我必须使用 Invoke 来更新 gui 线程中的标签
  • 这个功能是从单独的线程(不是 gui 线程)调用的吗?
  • 这个想法是在后台进行所有的“硬计算”,并且只调用来更新标签值。您必须将HardWork() 分为工作程序和更新程序。

标签: c# multithreading user-interface backgroundworker invoke


【解决方案1】:

这只能通过 BackgroundWorker 完成吗?

没有。 BackgroundWorker 只是一个帮助类,它只将工作委托给线程池。

那你的代码有什么问题?

您在负责运行消息循环的 UI 线程中睡觉。当您使用 Sleep 阻止它时,它无法运行消息循环,因此 UI 没有响应。

您可能打算在工作线程中休眠。你这样做如下

private void F()
{
    for (int i = 0; i < 10; i++)
    {
       label1.Invoke(new MethodInvoker(HardWork));
       Thread.Sleep(300);//Sleep in worker thread, not in UI thread
    }
}

private void HardWork()
{
    label1.Text += "x";
    //No sleep here. This runs in UI thread!
}

【讨论】:

  • 非常感谢大家。
  • @user3344394 你的问题解决了吗?如果是,您可以在我的答案中选中复选标记并将其标记为已解决。以便对未来的读者有所帮助。参考how accepting answer work
  • 我现在才这样做。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多