实现响应式gui与睡眠没有后台工作者

本文关键字:后台 工作者 响应 gui 实现 | 更新日期: 2023-09-27 17:50:55

我有这个代码,它保存一个Sleep。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);
    }

实现响应式gui与睡眠没有后台工作者

这只能通过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!
}