gpt4 book ai didi

c# - 从 Task.Continuewith 更新 UI 标签

转载 作者:太空狗 更新时间:2023-10-30 00:33:47 26 4
gpt4 key购买 nike

我正在开发 Winform 应用程序。 方法BackgroundWorker 线程启动。对不起。我之前没有提到这一点。

private void Method()
{
tasks[i] = Task.Factory
.StartNew(() => fileProcessor.ProcessEachMachine(mdetail))
.ContinueWith(UpdateLabel, TaskContinuationOptions.OnlyOnRanToCompletion);
}

我有一个长时间运行的函数 ProcessEachMachine。在延续函数 UpdateLabel 中,我想访问 UIlabel 并更新状态。

private void UpdateLabel()
{
progressLbl.Text = "updated";
}

但是标签没有更新。如何访问 UILabel 并更新它的文本?

最佳答案

您必须设置 TaskScheduler.FromCurrentSynchronizationContext在 ContinueWith 上,否则它将不会在 UI 上下文中运行。 Here is the MSDN on the override that you must use for this call to ContinueWith .

它最终应该是这样的:

.ContinueWith(UpdateLabel, null, 
TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext());

看起来好像什么都没发生,但 TPL 目前正在处理您的跨线程异常。您可能应该使用 UnobservedTaskException如果您不打算检查每个结果或检查其异常。否则,当发生垃圾收集时,就会发生异常...这可能会导致难以调试的错误。

更新

根据您关于由 Backgroundworker 设置和启动的主任务的更新,我的主要问题是为什么这不能使用任务来启动?事实上,如果 Method 中没有更多内容,那么这实际上只是双重工作,可能会使其他开发人员感到困惑。您已经异步启动,那么为什么不在后台工作人员中完成您的工作并使用 OnComplete 呢?将 UpdateLabel 的方法(因为后台工作人员已经知道上下文)。

但主要问题还是一样,所以如果您觉得必须使用 TPL,这里有一些其他解决方案:

  1. 您可以在 UpdateLabel 方法中调用回到主 UI 线程
  2. 您可以将当前上下文传递给 backgroundworker 并改用它
  3. 您可以等待您的原始任务返回,然后使用工作人员的 oncomplete 事件来更新标签。

下面是我将如何做到这一点(所有伪代码)

后台 worker 方法:

Method() called because of Background worker

private void Method()
{
fileProcessor.ProcessEachMachine(mdetail);
}

Wire up background worker's OnRunWorkerCompleted:

if(!e.Cancelled && !e.Error)
UpdateLabel();

只有任务的方法

Call Method() from the main thread and just let the TPL do its work :)

Task.Factory.StartNew(() => fileProcessor.ProcessEachMachine(mdetail))
.ContinueWith((precedingTask)=>{if(!precedingTask.Error)UpdateLabel;},
null, TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext());

关于c# - 从 Task.Continuewith 更新 UI 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com