【问题标题】:2 tasks running in parallel, but one finishes work and waits for the other to complete2 个任务并行运行,但一个完成工作并等待另一个完成
【发布时间】:2015-07-17 11:23:26
【问题描述】:

这是2 Async tasks in parallel and waiting for results - .Net中解决方案的扩展

这两个任务的方法是:

Private Sub tempWorker1()
  For i = 1 To 50000
     If i Mod 100 = 0 Then
        Console.WriteLine("From 1:{0}", i)
     End If
  Next
End Sub

Private Sub tempWorker2()
  For i = 1 To 1000
     If i Mod 100 = 0 Then
        Console.WriteLine("From 2:{0}", i)
     End If
  Next
End Sub

调用方法有:

Dim task1 As Task = Task.Run(AddressOf tempWorker1)
Dim task2 As Task = Task.Run(AddressOf tempWorker2)
Await Task.WhenAll(task1, task2).ConfigureAwait(False)

现在,我需要让task1task2 并行运行,但task1 不应该在task2 完成之前结束。整个过程应该等待这两个任务完成。

有没有办法使用 TPL 来实现这一点。还是我需要依靠全局变量来阻止task1 完成,直到task2 设置全局变量?

我知道 ContinueWith 但这会破坏并行性,因为任务一个接一个地运行 - 这不是要求。

【问题讨论】:

  • 如果我理解正确,您的tempWorker1()tempWorker2() 中的代码是虚拟代码;在您的实际代码中,tempWorker1() 需要在其执行过程中使用由tempWorker2() 计算的结果,但在达到该点之前应该允许这两个函数并行执行。我对吗?如果没有,请修改您的描述和代码示例,以更好地说明为什么您需要 task1 来“直到 task2 完成”。
  • 是的,你是对的。它们是虚拟代码,tempWorker1() 需要使用来自tempWorker2() 的结果。是的,应该允许这两个函数在达到该点之前并行执行。

标签: parallel-processing task-parallel-library task


【解决方案1】:

我需要让 task1 和 task2 并行运行,但 task1 不应该在 task2 完成之前结束。

所以,只需先启动task2,然后将task2 传递给tempWorker1

Dim task2 As Task = Task.Run(AddressOf tempWorker2)
Dim task1 As Task = Task.Run(Function() tempWorker1(task2))

并让tempWorker1 在需要该值时调用Await task2

【讨论】:

  • 谢谢斯蒂芬。说得通。想知道为什么我没听懂 :-) 了解 TPL 的路还很长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2019-05-24
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
相关资源
最近更新 更多