锁定行为Task.WaitAny与Task.Result

时间:2015-11-25 20:14:51

标签: c# .net multithreading async-await task

给定场景:

我正在努力解决一些锁定问题。下面是一个简化的代码,它描述了给定代码中的情况。我需要在非异步方法中使用异步方法,该方法应该返回GetContentFromDbAsync()方法的结果字符串

给定任务:

myTask = Task.Run(async () => await GetContentFromDbAsync(key));

现在我的问题在做这些变化时锁定行为有何不同? Task.Result锁定线程是否也适用于选项2?

选项1:

string result = myTask.ConfigureAwait(false)).Result;

在MSDN中,我可以阅读:

  

访问属性的get访问器会阻塞调用线程,直到   异步操作完成;它等同于召唤   等待方法。

选项2:

string result ;
myTask.ContinueWith( (t) => { result = t; },TaskContinuationOptions.OnlyOnRanToCompletion);
Task.WaitAny(myTask)

对于Task.WaitAny,在MSDN中没有写入这样的提示,他们只是缺少它还是有其他锁定行为,为什么?

所以Task.WaitAny会有更好的锁定行为。死锁?

1 个答案:

答案 0 :(得分:2)

Task.WaitAny也在阻止。请注意,Result上的MSDN评论声明“它等同于调用Wait方法”。因此,调用ResultWaitWaitAny或任何其他形式的等待会阻止当前线程,直到异步方法完成执行。