2013-02-26 312 views
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 

回答

2

首先,如果可能,永遠不要這樣做。同步等待異步方法會破壞使用異步的全部目的。相反,您應該將work()設爲Async Function WorkAsync() As Task。然後製作調用work()的方法,以此類推,直到完成。

二,異步並行不一樣。如果你有Async方法沒有Await s,它將完全同步執行,就好像它是一個正常的方法。所以,即使沒有Task.Wait(),你的方法也會掛起。

你可以做的是使用Task.Run()後臺線程運行Test()

Sub work() 
    Dim Task As Task = Task.Run(AddressOf Test) 
    Threading.Thread.Sleep(100) 
    workevent.Set() 
    Task.Wait() 
End Sub 

TaskRun()返回將完成從何時完成Test()返回Task

(有引起掛起結合Wait()Async當其他的問題,但他們不是在這個特定的情況下,相關的。)

但我重申:你不應該這樣做,因爲它會阻止UI線程,雖然只是短暫的。

+0

此函數正在單元測試中運行,所以它必須停止異步 – user1937198 2013-02-26 22:23:06

+0

@ user1937198它不,如果你的單元測試框架支持'異步'。目前版本的大多數.Net單元測試框架都可以。 – svick 2013-02-26 22:24:24

+0

+1。當前版本的MSTest,xUnit和NUnit都支持返回Task的'async'單元測試方法。 – 2013-02-27 01:42:34