在我的扣式听者中,我必须做一些事情。
1)更新标签文本
StatusLabel.Text= "start";2)工序工作,时间稍长一点。
3)更新标签文本
StatusLabel.Text="end";为什么我只能看到“结束”?
我知道工作不应该在UI线程中运行,但是如何在C#中运行呢?
发布于 2014-03-05 09:03:18
你必须异步完成这个任务。
你可以使用这样的东西:
StatusLabel.Text= "start";
Task.Factory.StartNew( () => YourHeavyTask() ).ContinueWith( (n) => this.Invoke((MethodInvoker)delegate { StatusLabel.Text = "end"; }) );这个示例使用第三方物流,它比使用BackgroundWorker更新(有些人说更好),等等。
就我个人而言,我认为两者都是好的,这取决于你觉得更舒服的地方。我建议TPL,当您有一些更复杂的任务取决于另一个或什么时候可以并行运行。
发布于 2014-03-05 09:01:55
我假设您在同一线程中依次在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();https://stackoverflow.com/questions/22192864
复制相似问题