我正在使用VS2012RC和.NET 4.5尝试新的async
和await
关键字,只需要一个返回字符串的简单委托,当我运行单个字符串时,该工作正常:
string message = await Task.Run(() => { return "something"; });
但是当我尝试WhenAny
时:
string message = await Task.WhenAny(new Task<string>(() => { return "something"; })).Result;
它永远不会完成......为什么?
我一直在观看来自TechDays 2012荷兰的史蒂夫桑德森的视频,这看起来非常简单:http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287
答案 0 :(得分:4)
使用其构造函数创建Task
时,它尚未启动。您必须致电Start()
才能真正启动它。
我认为你也应该在你的第二个版本中使用Task.Run()
,这会返回一个已经开始的Task
。
此外,将异步等待(await
)与同步等待(Result
或Wait()
)混合起来是个坏主意,因为it can lead to a deadlock。
所以,我会把你的代码写成:
var task = await Task.WhenAny(Task.Run(() => "something"));
string message = await task;
(当然,当你只有一个Task.WhenAny()
时没有理由使用Task
,但我认为这只是一个例子。)