使用Result和ConfigureAwait(true)

时间:2017-05-10 19:29:52

标签: c# multithreading async-await deadlock

在创建一个我希望使异步方法同步的库时,我遇到了很多情况。我通常做这样的事情:

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,但我觉得应该有更简单/更好的方法。我不相信每次都需要在另一个线程上运行代码。

0 个答案:

没有答案