在长时间运行的代码之前和之后更新标签文本

时间:2014-03-05 08:57:39

标签: c#

在我的按钮监听器中,我必须做一些事情。

1)更新标签文本

StatusLabel.Text= "start";

2)处理工作,时间稍长。

3)更新标签文本

StatusLabel.Text="end";

为什么我只能看到“结束”?

我知道工作不应该在UI线程中运行,而是如何在C#中运行?

2 个答案:

答案 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。