【问题标题】:WhenAny method in task async in .NET 4.5 Never Completes.NET 4.5 中任务异步中的WhenAny 方法从不完成
【发布时间】:2012-07-15 23:42:02
【问题描述】:

我正在尝试使用 VS2012RC 和 .NET 4.5 使用新的 asyncawait 关键字,只使用一个返回字符串的简单委托,当我运行单个委托时效果很好:

string message = await Task.Run(() => { return "something"; });

但是当我尝试WhenAny:

string message = await Task.WhenAny(new Task<string>(() => { return "something"; })).Result;

它永远不会完成......为什么?

我一直在观看来自 TechDays 2012 荷兰的 Steve Sanderson 的视频,这让这看起来非常简单:http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287

【问题讨论】:

    标签: .net task-parallel-library async-await


    【解决方案1】:

    当您使用其构造函数创建Task 时,它还没有启动。您必须致电 Start() 才能真正启动它。

    我认为您也应该在第二个版本中使用Task.Run(),它会返回一个已经启动的Task

    此外,将异步等待 (await) 与同步等待 (ResultWait()) 混合使用也是一个坏主意,因为 it can lead to a deadlock

    所以,我会把你的代码写成:

    var task = await Task.WhenAny(Task.Run(() => "something"));
    string message = await task;
    

    (当然,当您只有一个Task 时,没有理由使用Task.WhenAny(),但我假设这只是一个示例。)

    【讨论】:

    • 对。 Task 上有很多东西在编写 async/await 代码时通常不应该使用。我的async/await intro post 底部有一个列表:Task 构造函数、WaitResultWaitAnyWaitAll。另外,Thread.Sleep.
    • 出于好奇,Task 最初是 .NET 4.0 中任务并行库的主干。这就是为什么它有很多从基于同步 CPU 的角度设计的 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多