Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何从非异步方法异步调用异步方法_Vb.net_Async Await - Fatal编程技术网

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