首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在长时间运行代码之前和之后更新标签文本

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

Stack Overflow用户
提问于 2014-03-05 08:57:39
回答 2查看 1K关注 0票数 0

在我的扣式听者中,我必须做一些事情。

1)更新标签文本

代码语言:javascript
复制
StatusLabel.Text= "start";

2)工序工作,时间稍长一点。

3)更新标签文本

代码语言:javascript
复制
StatusLabel.Text="end";

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-05 09:03:18

你必须异步完成这个任务。

你可以使用这样的东西:

代码语言:javascript
复制
StatusLabel.Text= "start";

Task.Factory.StartNew( () => YourHeavyTask() ).ContinueWith( (n) => this.Invoke((MethodInvoker)delegate { StatusLabel.Text = "end"; }) );

这个示例使用第三方物流,它比使用BackgroundWorker更新(有些人说更好),等等。

就我个人而言,我认为两者都是好的,这取决于你觉得更舒服的地方。我建议TPL,当您有一些更复杂的任务取决于另一个或什么时候可以并行运行。

票数 3
EN

Stack Overflow用户

发布于 2014-03-05 09:01:55

我假设您在同一线程中依次在1之后和3之前运行步骤2。这方面的问题是,代码永远不会“生成”控制,因此应用程序没有机会绘制文本更改。

使用BackgroundWorker或类似的类,以便在单独的线程中运行步骤2来释放UI线程。

更新

我会像帕特里克建议的那样使用Task。如果您确实想使用BackgroundWorker,下面是您可以做的事情的示例:

代码语言:javascript
复制
StatusLabel.Text = "start";

var worker = new BackgroundWorker();
worker.DoWork += (s, e) => YourHeavyTask();
worker.RunWorkerCompleted += (s, e) => StatusLabel.Text = "end";
worker.RunWorkerAsync();
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22192864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档