锁定行为Task.WaitAny与Task.Result

本文关键字:Task Result WaitAny 锁定 | 更新日期: 2023-09-27 18:24:40

给定场景:

我遇到了一些锁定问题。下面是一个简化的代码,它描述了给定代码中的情况。我需要在非异步方法中使用一个异步方法,它应该返回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.Wait如果MSDN中没有写这样的提示,他们只是错过了它,还是它有另一种锁定行为,为什么?

那么Task.WaitAny在at pot方面会有更好的锁定行为吗。死锁?

锁定行为Task.WaitAny与Task.Result

Task.WaitAny也在阻塞。请注意,MSDN对Result的评论指出"这相当于调用Wait方法"。因此,调用ResultWaitWaitAny或任何其他形式的等待会阻塞当前线程,直到异步方法完成执行。