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

まず、可能であれば、決してそれをしないでください。asyncメソッドを同期的に待機すると、asyncを使用する目的全体が無効になります。代わりに、を作成する必要がwork()ありAsync Function WorkAsync() As Taskます。次に、work()非同期を呼び出すメソッドも作成します。

第二に、非同期は並列と同じではありません。Asyncsのないメソッドがある場合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スレッドをブロックするため、これを行うべきではありません。ただし、これは短時間です。

于 2013-02-26T22:21:54.520 に答える