1

如何在非异步方法中等待来自异步方法的任务,而不实际调用该方法?

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
4

1 回答 1

2

首先,如果可能的话,永远不要那样做。同步等待异步方法破坏了使用异步的全部目的。相反,您应该制作work()Async Function WorkAsync() As Task. 然后使调用work()异步的方法也如此,依此类推,一直向上。

其次,异步与并行不同。如果你有Async没有Awaits 的方法,它将完全同步执行,就好像它是一个普通方法一样。因此,即使没有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()(在组合and时还有其他导致挂起的问题Async,但在这种特定情况下它们不相关。)

但我再说一遍:你不应该这样做,因为它会阻塞 UI 线程,尽管它只是暂时的。

于 2013-02-26T22:21:54.520 回答