在没有背景工作者的情况下实现响应gui与睡眠

时间:2015-05-27 11:56:23

标签: c# multithreading user-interface backgroundworker invoke

我有这个代码,它持有睡眠。虽然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);
    }

1 个答案:

答案 0 :(得分: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!
}