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