如何在.NET 4.0 web应用程序中安全地(从死锁)调用异步方法



我可以做一些类似service.GetLocaton(111).Result的事情,但这可能会死锁,我试过

Task.Factory.StartNew (async () => await service.GetLocaton(), CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).Result.Reult

但这看起来并不正确。

您可以使用Task.Run(() => ...).Result。请注意,最好始终使用async/await,或者保持完全同步。但有时你需要一个变通方法,我在这里显示的代码总是安全的(例如在ASP.NET中(。

没有Task.Run,你可以写:

Task.Factory.StartNew(
async () => await service.GetLocaton(),
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default).Unwrap().Result

重要的一点是,service.GetLocaton()是在没有设置SynchronizationContext的线程上调用的。

最新更新