Vb.net 如何从非异步方法异步调用异步方法
在非异步方法中,如何等待来自异步方法的任务,而不实际调用该方法Vb.net 如何从非异步方法异步调用异步方法,vb.net,async-await,Vb.net,Async Await,在非异步方法中,如何等待来自异步方法的任务,而不实际调用该方法 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
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
首先,如果可能的话,千万不要这样做。同步等待异步方法会破坏使用异步方法的全部目的。相反,您应该将
work()
转换为异步函数WorkAsync(),作为任务
。然后使调用work()
的方法也异步,以此类推
其次,异步与并行不同。如果您使用的Async
方法没有Await
s,它将完全同步执行,就像它是一个正常的方法一样。因此,即使没有Task.Wait()
,您的方法也会挂起
您可以使用Task.run()
在后台线程上运行Test()
:
当从Test()
返回的任务完成时,从Run()
返回的任务将完成
(当组合Wait()
和Async
时,还有其他问题会导致挂起,但它们与此特定情况无关。)
但我重复一遍:您不应该这样做,因为它会阻塞UI线程,尽管这只是暂时的。此函数正在单元测试中运行,因此必须停止异步somewhere@user1937198如果您的单元测试框架支持Async
,它就不支持。以及.NETDO.+1的大多数单元测试框架的当前版本。MSTest、xUnit和NUnit的当前版本都支持返回任务的单元测试方法。不是VS2012的2版ctp 3附带的MSTest,MSTest是否可以单独升级?
Sub work()
Dim Task As Task = Task.Run(AddressOf Test)
Threading.Thread.Sleep(100)
workevent.Set()
Task.Wait()
End Sub