如何并行运行任务?

时间:2021-03-08 02:58:28

标签: vb.net

我有以下代码,其中包含两个我想并行运行的方法:LoopA 和 LoopB

Sub Main(args As String())
    Proceed()
End Sub

Public Async Function Proceed() As Task
    Task.WaitAll(LoopA, LoopB)
End Function

Private Function LoopA() As Task
    While True
        Threading.Thread.Sleep(1000)
        Console.WriteLine("A")
    End While
End Function

Private Function LoopB() As Task
    While True
        Threading.Thread.Sleep(1000)
        Console.WriteLine("B")
    End While
End Function

运行此代码时,两个任务不会并行运行。我只得到 A、A、A...

enter image description here

谁能告诉我为什么这些任务不能并行运行?

谢谢

2 个答案:

答案 0 :(得分:3)

您的方法不是异步的。

Sub Main(args As String())
    Proceed()
End Sub

Public Function Proceed() As Task
    Task.WaitAll(LoopA, LoopB)
End Function

Private Async Function LoopA() As Task
    Await Task.Run(Async Function()
                       While True
                           Await Task.Delay(1000)
                           Console.WriteLine("A")
                       End While
                   End Function)
End Function

Private Async Function LoopB() As Task
    Await Task.Run(Async Function()
                       While True
                           Await Task.Delay(1000)
                           Console.WriteLine("B")
                       End While
                   End Function)
End Function

如果您不打算实际编写这些方法以使它们异步,那么它们都应该是 Sub 而不是函数,并且您可以在调用它们时添加异步性:

Sub Main(args As String())
    Proceed()
End Sub

Public Function Proceed() As Task
    Dim taskA = Task.Run(AddressOf LoopA)
    Dim taskB = Task.Run(AddressOf LoopB)

    Task.WaitAll(taskA, taskB)
End Function

Private Sub LoopA()
    While True
        Threading.Thread.Sleep(1000)
        Console.WriteLine("A")
    End While
End Sub

Private Sub LoopB()
    While True
        Threading.Thread.Sleep(1000)
        Console.WriteLine("B")
    End While
End Sub

答案 1 :(得分:0)

AsyncAwait 不会自动将东西放到不同的线程中。就其本身而言,它们唯一的功能是进行设置,以便如果有某种可以在幕后完成的处理,那么控制将返回到用户界面,直到处理结束。

AsyncAwait 的一个常见用例本身甚至不涉及线程。它涉及 IO,它将完全在主线程上运行(参见 Stephen Cleary 的“没有线程”博客文章)。

AsyncAwait 是有用的帮助器,可以使与并行的交互更好、更自然,但您必须自己介绍并行。对于已经在 Task 上下文中完成的 CPU 绑定处理,最好的方法是使用 Task.Run,这在 jmcilhinney 的优秀答案中有所介绍。

相关问题