使用这个异步函数:
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
理想的解决方案是而不是阻塞异步代码(正如我在博客上解释的那样(。
但是,如果您的情况是,实际上不能使用Await
(出于某种原因(,那么您可以尝试使用我的Brownfield Async文章中的一种技术。请注意,没有一个通用的解决方案可以在任何地方工作。
您建议的方法是在线程池线程中阻塞结果,这可能起作用,也可能不起作用。在您发布的示例代码中,它不起作用,因为MyAsyncFunction
已经捕获了UI上下文,并将尝试在该上下文中继续。
可以尝试从传递给Task.Run
的委托内部调用MyAsyncFunction
,然后对返回的任务调用GetAwaiter().GetResult()
。这适用于大多数情况。在我的文章中,我将其称为";线程池破解";。