我正在构建一个WP8应用程序,我需要执行大约30个Web请求.这些请求不依赖于彼此,因此可以并行化.
我的代码看起来像这样(简化/伪代码):
foreach (Uri uri in uris) { var rawData = await Task.Run(() => httpClient.GetStringAsync(uri).ConfigureAwait(false)); var processedData = dataProcessor.Process(rawData); processedDataCollection.Add(processedData); }
当我看到提琴手时,请求全部都是连续的; 它需要几秒钟来执行和处理所有这些.但是,我不希望代码等到1个请求完成后才转移到下一个请求,我想同时执行多个请求.
通常我会使用Parallel.Invoke()
或Parallel.ForEach()
类似的东西来做到这一点,但显然并行库在Windows Phone 8中不可用.
那么实现这一目标的最佳方法是什么?Task.Factory.StartNew()
?new Thread()
?
没有必要在单独的线程上运行每个请求.您可以轻松地执行此操作:
var raw = await Task.WhenAll(uris.Select(uri => httpClient.GetStringAsync(uri))); var processed = raw.Select(data => dataProcessor.Process(data)).ToArray();
此代码收集uris
并开始每个(Select(...)
)的HTTP下载.然后它异步地等待它们全部完成(WhenAll
).然后在第二行代码中处理所有数据.
但是,Windows Phone运行时可能会限制您对同一服务器的最大请求数.