给定场景:
我正在努力解决一些锁定问题。下面是一个简化的代码,描述了给定代码中的情况。我需要在非异步方法中使用异步方法,该方法应返回 GetContentFromDbAsync()
方法的结果字符串
给定任务:
myTask = Task.Run(async () => await GetContentFromDbAsync(key));
现在我的问题是,在进行这些变化时,锁定行为是否存在差异? Task.Result 是否锁定线程 对于选项 2 来说也是如此吗?
选项 1:
string result = myTask.ConfigureAwait(false)).Result;
在 MSDN 中我可以读到:
Accessing the property's get accessor blocks the calling thread until the asynchronous operation is complete; it is equivalent to calling the Wait method.
选项 2:
string result ;
myTask.ContinueWith( (t) => { result = t; },TaskContinuationOptions.OnlyOnRanToCompletion);
Task.WaitAny(myTask)
对于Task.WaitAny,MSDN 中没有写这样的提示,他们只是缺少它还是有其他锁定行为,为什么?
因此,Task.WaitAny
在 Pot 方面会有更好的锁定行为。死锁?
最佳答案
Task.WaitAny
也处于阻塞状态。请注意,MSDN 对 Result
的注释指出“它相当于调用 Wait 方法”。因此,调用 Result
、Wait
、WaitAny
或任何其他形式的等待都会阻塞当前线程,直到异步方法完成执行。
关于c# - 锁定行为 Task.WaitAny 与 Task.Result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925654/