如何从非异步方法异步调用异步方法

时间:2013-02-26 21:34:37

标签: 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.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

1 个答案:

答案 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线程,虽然它只是暂时的。