我有这个代码,它保存一个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);
}
这只能通过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!
}