c# - 锁定行为 Task.WaitAny 与 Task.Result

标签 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 中我可以读到:

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 方法”。因此,调用 ResultWaitWaitAny 或任何其他形式的等待都会阻塞当前线程,直到异步方法完成执行。

关于c# - 锁定行为 Task.WaitAny 与 Task.Result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925654/

相关文章:

c# - 返回 IDisposable 对象后会发生什么情况?

c# - 在 Sharepoint 中使用 C# 为 Web 部件布置表单

c++ - 这个锁 block 是如何工作的?

c++ - 有没有可能 : Using multiple threads to stream output to different files/

c# - 使用 Visual Studio 远程调试时是否可以设置断点?

c# - 为什么 Powershell 无法识别 Add_Type block 中的 System.Data?

.net - 确定适当的任务数量

.net - 占位符中的用户控件

c# - 使用偶尔为空属性的 LINQ SequenceEqual 扩展方法

java - 延迟后如何运行方法?