【问题标题】:Parallel Task Wait from UI without blocking来自 UI 的并行任务等待而不会阻塞
【发布时间】:2014-03-27 21:56:48
【问题描述】:

我使用并行任务库在后台运行异步任务。有时我必须等待后台任务的完成委托,而 UI 线程是非阻塞的。

所以:

  1. 在 UI 线程中启动微调器
  2. 在后台做一些需要等待的工作
  3. 然后运行另一个后台任务
  4. 在 UI 中停止微调器

我在UI线程(2)中启动了后台任务,之后我尝试调用Wait方法,这导致了死锁......

我需要一个解决方案来等待指定的后台任务而不阻塞 UI 线程。 .NET 框架是 4,所以我不能使用 asyncawait

更新:

在 UI 线程中:

Task task = Task.Factory.StartNew<T>(() => BackgroundTask());
task.ContinueWith(task => CompletedTask(((Task<T>)task).Result); // I want to prevent later tasks to start before this task is finished
task.Wait(); // this will block the ui...

任何建议表示赞赏。

【问题讨论】:

标签: c# asynchronous task-parallel-library


【解决方案1】:

您使用ContinueWith 将延续附加到任务并在任务完成时运行一些代码。 await 在幕后有效地做着同样的事情。

您可以使用Task.Factory.ContinueWhenAll 在所有任务集合完成后运行延续。

您可以在 UI 线程中使用 TaskScheduler.FromCurrentSynchronizationContext() 来获取能够在 UI 线程中调度任务的任务调度程序。

【讨论】:

  • 谢谢你的回答,我试过了(可能是我做错了或者没明白重点)但是没有用。当我在 UI 线程中调用后台任务时,我在完成的任务中设置了 ContinueWith。但后来在 UI 线程中,我开始了另一个任务。而我要等到第一个任务完成。这就是我尝试使用 Wait 的原因。
  • @hcpeter 请显示您尝试的内容作为对问题的编辑,届时我们可以帮助您纠正错误。
  • @hcpeter 存储对任务的引用,然后在稍后的某个时间点,当您想要在该任务完成后执行某项操作时,向它添加一个延续,而不是等待它。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多