在创建一个我希望使异步方法同步的库时,我遇到了很多情况。我通常做这样的事情:
async Task<object> DoSomethingAsync() { ... } // Original method
object DoSomethingSync()
{
return DoSomethingAsync().Result;
}
这在大多数情况下都可以正常工作,但想象一下异步方法的主体看起来像这样:
async Task<object> DoSomethingAsync()
{
object result = await CallAServiceAsync().ConfigureAwait(true); // This is important
// Do something with the result on the caller's context (e.g. UI updates)
return result;
}
线程将运行,返回调用者,在任务上执行相当于.Wait()
的操作(在.Result
中)。当CallAServiceAsync()
返回时,它会尝试恢复原始上下文,但由于.Result
正在等待而将会死锁。
我可以使用Task.Run(()=>DoSomethingAsync()).Result
,但我觉得应该有更简单/更好的方法。我不相信每次都需要在另一个线程上运行代码。