3

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

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

但是当我尝试时WhenAny

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

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

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

4

1 回答 1

4

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

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

await此外,将异步等待 ( ) 与同步等待 ( Resultor )混合使用也是一个坏主意Wait(),因为它会导致死锁

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

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

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

于 2012-07-15T15:36:04.463 回答