如何在非异步方法中等待来自异步方法的任务,而不实际调用该方法?
Class TestAsync
Dim workevent As New Threading.ManualResetEvent(False)
Sub work()
Dim Task As Task = Test()
'Do Work which affects Test Here
Threading.Thread.Sleep(100)
workevent.Set()
'wait for Test to complete
'Task.Wait() -causes the application to hang
End Sub
Async Function Test() As Task
workevent.WaitOne()
End Function
End Class
答案 0 :(得分:2)
首先,如果可能的话,永远不要那样做。同步等待异步方法会失败使用异步的全部目的。相反,您应该将work()
变为Async Function WorkAsync() As Task
。然后使调用work()
的方法也异步,依此类推,一直如此。
其次,异步与并行不同。如果你的Async
方法没有Await
,它将完全同步执行,就像它是一个普通的方法一样。因此,即使没有Task.Wait()
,您的方法也会挂起。
您可以做的是使用Test()
在后台线程上运行Task.Run()
:
Sub work()
Dim Task As Task = Task.Run(AddressOf Test)
Threading.Thread.Sleep(100)
workevent.Set()
Task.Wait()
End Sub
从Task
返回的Run()
完成后,Task
返回的Test()
将完成。
(合并Wait()
和Async
时还有其他问题导致挂起,但在这种特定情况下它们并不相关。)
但我再说一遍:你不应该这样做,因为它阻止了UI线程,虽然它只是暂时的。