从同步函数调用异步函数,导致x.result挂起..用扩展插件修复它



使用这个异步函数:

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()。这适用于大多数情况。在我的文章中,我将其称为";线程池破解";。

最新更新