我有以下代码,其中包含两个我想并行运行的方法: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...
谁能告诉我为什么这些任务不能并行运行?
谢谢
答案 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)
Async
和 Await
不会自动将东西放到不同的线程中。就其本身而言,它们唯一的功能是进行设置,以便如果有某种可以在幕后完成的处理,那么控制将返回到用户界面,直到处理结束。
Async
和 Await
的一个常见用例本身甚至不涉及线程。它涉及 IO,它将完全在主线程上运行(参见 Stephen Cleary 的“没有线程”博客文章)。
Async
和 Await
是有用的帮助器,可以使与并行的交互更好、更自然,但您必须自己介绍并行。对于已经在 Task
上下文中完成的 CPU 绑定处理,最好的方法是使用 Task.Run
,这在 jmcilhinney 的优秀答案中有所介绍。