当.NET 4.5中的任务异步中的任何方法永不完成时

时间:2012-07-15 14:59:40

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

我正在使用VS2012RC和.NET 4.5尝试新的asyncawait关键字,只需要一个返回字符串的简单委托,当我运行单个字符串时,该工作正常:

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

但是当我尝试WhenAny时:

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

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

我一直在观看来自T​​echDays 2012荷兰的史蒂夫桑德森的视频,这看起来非常简单:http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287

1 个答案:

答案 0 :(得分:4)

使用其构造函数创建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.WhenAny()时没有理由使用Task,但我认为这只是一个例子。)