2012-07-15 50 views
3

我试着用新的asyncawait关键字使用VS2012RC和.NET 4.5只是一个简单的委托,返回一个字符串,它运行良好,当我运行一个:当.NET 4.5中任务异步的任何方法从未完成

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

回答

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,但我假设这只是一个例子。)

+0

对。 ''Task'上有很多东西,写'async' /'await'代码时通常不应该使用它。我在['async' /'await' intro post](http://nitoprograms.blogspot.com/2012/02/async-and-await.html)的底部列出了一个列表:'Task'构造函数,'' Wait“,”Result“,”WaitAny“和”WaitAll“。此外,'Thread.Sleep'。 – 2012-07-15 16:05:12

+0

为了好奇,'Task'作为.NET 4.0中任务并行库的支柱而出现。这就是为什么它有许多基于同步CPU的视角设计的API。 – 2012-07-15 16:09:01