【发布时间】:2015-08-09 11:52:55
【问题描述】:
我有这段代码,它包含一个睡眠。尽管 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);
}
【问题讨论】:
-
调用正是它响应不佳的原因。它使代码在 UI 线程上运行。是否有理由不使用
BackgroundWorker或只是出于好奇? -
如果您在主线程上调用 sleep(ms),应用程序将变得无响应。在 C# 中有多种处理线程的方法。 Async Await、Background worker、“Native thread”等
-
但我必须使用 Invoke 来更新 gui 线程中的标签
-
这个功能是从单独的线程(不是 gui 线程)调用的吗?
-
这个想法是在后台进行所有的“硬计算”,并且只调用来更新标签值。您必须将
HardWork()分为工作程序和更新程序。
标签: c# multithreading user-interface backgroundworker invoke