Multiple Parallel Task.ContinueWith执行顺序

Tom*_*Tom 13 .net task-parallel-library

这可能是我错过的简单事情.

让我说我做(在loveley VB中):

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()
Run Code Online (Sandbox Code Playgroud)

注意t1.ContinueWith使用两次.这些任务的首选执行顺序是什么?对我来说,无论是随机还是错误.

为什么?

我想这样做的原因......

  1. 创建抓取和返回数据的任务
  2. 接下来是一个任务"在TaskScheduler.FromCurrentSynchronizationContext()UI线程上""分类"UI
  3. 通过将数据转换为长报告(需要很长时间)来跟踪原始数据获取任务
  4. 返回UI线程,将该报告分配给预览控件
  5. 清理(​​摆脱我的进度动画等)

由于步骤4是可选的,因此这变得更加复杂.

在所有这些中,我的任务向后弯曲以设置成员属性,因此UI和任务可以很好地发挥作用.也许我应该完全放弃任务结果,只是坚持Synclocking我的成员变量.它们都只是一次性分配.

谢谢,汤姆

Alo*_*aus 11

任务以LIFO顺序执行,以获得更好的内存位置.当然,如果您使用不同的调度程序或MS决定"修复"原始调度程序,则可以更改此项.我认为你不应该依赖这种行为.相反,您可以解开任务,以便在完成上一个任务后继续处理.否则你在等待错误的事情.更多信息可以在这里找到:http://msdn.microsoft.com/en-us/library/ee795275.aspx


Ian*_*cer 5

如果您想强制执行 t2 和 t3 之间的顺序,为什么不直接更改为使 t3 从 t2 而不是 t1 继续?

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t2.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()
Run Code Online (Sandbox Code Playgroud)

如果 t2 和 t3 长时间运行,它们将按照您编写的方式并行执行。

无需创建自定义任务计划程序来更改此行为。