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

时间:2018-11-05 17:33:10

标签: async-await

我可以做类似service.GetLocaton(111).Result的事情,但这可能会造成僵局, 我尝试过

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

但这看起来不正确。

1 个答案:

答案 0 :(得分:1)

您可以使用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