在没有 backgroundworker 的情况下实现带睡眠的响应式 gui

Implement responsive gui with sleep without backgroundworker

我有这个代码,它包含一个睡眠。 Gui 反应不好,虽然Invoke。当我使用 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);
    }

Can this be done only with BackgroundWorker?

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

Then what is wrong with your code?

您正在 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!
}