Async CTP Task.WhenAll问题

时间:2011-11-11 14:46:39

标签: c#

我被困在一些看似简单的东西上,但我看不出我做错了什么。我有一个简单的类结构'StaticQuote',它描述了复杂计算返回的值,我试图找到最低值。因为Calculate调用很昂贵,所以我创建了一个任务数组,因此计算并行执行,然后使用Task.WhenAll等待它们全部完成,然后再比较结果(存储在StaticQuote对象中)。问题是,当尝试返回StaticQuotes数组时,我收到以下错误:

  

无法隐式将'System.Threading.Tasks.Task<Services.QuoteGeneratorAsync.StaticQuote[]>'类型转换为'Services.QuoteGeneratorAsync.StaticQuote[]'

我已经看过类似的字符串等示例,其中这个赋值完美无缺,因此无法理解哪一个右侧没有返回一个StaticQuote结果数组?我是多线程代码和Async CTP的新手。任何人都可以提供答案吗?非常感谢。

示例问题:

List<Task<StaticQuote>> Calculations = new List<Task<StaticQuote>>();
foreach()
{
Calculations.Add(TaskEx.RunEx(() => Calculate(...my params....)));                                             
}
StaticQuote[] Quotes=TaskEx.WhenAll<StaticQuote>(Calculations);  --//this line won't compile

1 个答案:

答案 0 :(得分:1)

TaskEx.WhenAll返回Task<T[]>,表示所有其他任务何时完成。所以你想要:

StaticQuote[] quotes = await TaskEx.WhenAll(Calculations);

await表达式“展开”Task<T>T。所以在其他地方,如果你有:

Task<string> downloadTask = webClient.DownloadStringTaskAsync(url);
string result = await downloadTask;

它完全相同 - 只是WhenAll版本稍微复杂一点,因为它有一个集合的任务输入和输出,而不是一个。

显然,为了使用await,您必须使用async方法开始。

如果所有这些仍然令人困惑,您可能需要阅读我的blog posts about async以及those of Eric Lippert。 (当然,还有很多其他的可用。)