使用這個異步函式:
Public Async Function MyAsyncFunction() As Task(Of String)
Return Await SomeFunctionThatReturnsAString()
End Function
如果我從這樣的同步函式中呼叫它:
Public Function MySyncFunction() As String
Return MyAsyncFunction.Result
End Function
...函式掛起。
我想知道是否可以撰寫這樣的擴展(下面的擴展不起作用):
Public Module TaskExtensions
<Extension()>
Public Function SyncronousResult(Of T)(aTask As Task(Of T)) As T
Dim result As T = Nothing
Task.Run(Sub()
result = aTask.Result
End Sub).Wait()
Return result
End Function
End Module
...所以我可以這樣稱呼它:
Public Function MySyncFunction() As String
Return MyAsyncFunction.SyncronousResult
End Function
?
uj5u.com熱心網友回復:
理想的解決方案是不要阻塞異步代碼(正如我在博客中解釋的那樣)。
但是,如果您處于實際上無法使用Await(出于某種原因)的情況,那么您可以嘗試使用我的Brownfield Async 文章中的一種技術。請注意,沒有適用于任何地方的通用解決方案。
您建議的是阻塞執行緒池執行緒中的結果,這可能會也可能不會起作用。在您發布的示例代碼中,它不起作用,因為MyAsyncFunction已經捕獲了 UI 背景關系并將嘗試在該背景關系中恢復。
您可以嘗試MyAsyncFunction從傳遞給的委托內部呼叫Task.Run,然后呼叫GetAwaiter().GetResult()回傳的任務。這在大多數情況下都有效。在我的文章中,我將此稱為“執行緒池黑客”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503738.html
上一篇:.txt檔案到帶有更改的富文本框
下一篇:替換asp.net中的值
