在我的按钮监听器中,我必须做一些事情。
1)更新标签文本
StatusLabel.Text= "start";
2)处理工作,时间稍长。
3)更新标签文本
StatusLabel.Text="end";
为什么我只能看到“结束”?
我知道工作不应该在UI线程中运行,而是如何在C#中运行?
答案 0 :(得分:4)
我假设您在同一个线程中在1之后和3之前顺序运行步骤#2。这样做的问题是代码永远不会“让步”控制,因此应用程序没有机会绘制文本更改。
使用BackgroundWorker或类似的类,以便在单独的线程中运行第2步,以释放UI线程。
更新:
帕特里克建议我使用Task
。如果您确实想使用BackgroundWorker,请参考以下示例:
StatusLabel.Text = "start";
var worker = new BackgroundWorker();
worker.DoWork += (s, e) => YourHeavyTask();
worker.RunWorkerCompleted += (s, e) => StatusLabel.Text = "end";
worker.RunWorkerAsync();
答案 1 :(得分:3)
你必须异步。
您可以使用以下内容:
StatusLabel.Text= "start";
Task.Factory.StartNew( () => YourHeavyTask() ).ContinueWith( (n) => this.Invoke((MethodInvoker)delegate { StatusLabel.Text = "end"; }) );
此示例使用TPL,这是更新的(有些人说更好)然后使用BackgroundWorker
等。
我个人认为两者都很好,取决于你感觉更舒服。当你有一些更复杂的任务取决于另一个或者它们可以并行运行时,我会建议TPL。