2011-11-11 65 views
0

我被困在看起来很简单的东西,但我不明白我做错了什么。我有一个简单的类结构'StaticQuote',它描述了从我试图找到最低值的复杂计算中返回的值。由于Calculate调用非常昂贵,因此我创建了一组任务,以便并行执行计算,然后使用Task.WhenAll等待比较结果(存储在StaticQuote对象中)之前全部完成。问题是,试图返回StaticQuotes的阵列我收到以下错误时:异步CTP任务。当所有问题

Cannot implicitly convert type 'System.Threading.Tasks.Task<Services.QuoteGeneratorAsync.StaticQuote[]>' to 'Services.QuoteGeneratorAsync.StaticQuote[]'

我已经看到了串等,其中该分配工作完全类似的例子所以无法了解其右侧没有返回一个StaticQuote结果数组?我是多线程代码和异步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

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。 (当然也有很多其他的可用。)

+0

非常感谢乔恩 - 不会等待导致线程继续前进吗?我有一个循环的顶层,它再次调用了整个事物,所以试图一次控制走在线程的数量。我看到这个例子http://stackoverflow.com/questions/4174806/what-is-taskex-whenall-in-the-async-ctp为什么他在这里做的任务不适合我?托尼小马怎么样? :) – dustybin

+0

@dustybin:'await'将导致该方法返回给调用者,但是当所有任务完成后它会回到这个方法。链接的问题*中的任务*使用'await',所以我不确定你的意思... –

+0

是的例子使用await,但我担心,如果线程继续它会产生下一批计算线程从我的外部循环。这不应该是一个问题,我只是试图看看是否可以控制线程数量,因为Calculate()需要3-5秒才能返回。不想让太多人同时跑步。我去年在Async上进行了DDD Modern .Net日的演讲,但这是我第一次使用它。也刚刚意识到WhenAll有一个“.Result”属性 - doh。将阅读博客......欢呼声。 – dustybin