2015-11-25 40 views
2

给定的情景:锁定行为Task.WaitAny与Task.Result

我与一些锁定问题挣扎。以下是描述给定代码情况的简化代码。我需要使用内部非异步方法一个异步方法应该返回GetContentFromDbAsync()方法生成的字符串

给定的任务:

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

我现在的问题是有没有锁定行为的差异时做这些变化? Task.Result是否锁定线程对于选项2也是如此?

选项1:

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

在MSDN我可以读:

访问属性的get访问阻塞调用线程,直到 异步操作完成;它相当于调用 的Wait方法。

选项2:

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

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

因此Task.WaitAny在锅中会有更好的锁定行为。死锁?

+1

你为什么坚持从同步方法调用异步方法。什么阻止你调用/编写同步版本的'GetContentFromDbAsync()'或使代码调用'GetContentFromDbAsync()'异步呢?如果你正在使用async,因为“你的工作方式更快”,它会比完全同步或者完全异步完成时表现更差,混合都会给你两种风格带来的性能损失,而你不会得到任何收益。 –

+0

因为该方法在剃须刀视图内用作HTML扩展。 –

+0

好吧,这解释了为什么你不能使它异步,为什么不能调用'GetContentFromDb()'? –

回答

2

Task.WaitAny也被阻塞。请注意,MSDN对Result的评论声明“这相当于调用Wait方法”。所以调用Result,Wait,WaitAny或任何其他形式的等待阻塞当前线程,直到异步方法完成执行。

+0

确定只是满足我的期望,但不确定是否缺少提示 –