最近,NDC伦敦的Jon Skeet谈到了C#5 async/await,并提出了" 按完成排序 " 的想法,列出了异步任务.链接http://msmvps.com/blogs/jon_skeet/archive/2012/01/16/eduasync-part-19-ordering-by-completion-ahead-of-time.aspx
我有点困惑,或者我应该说我不确定这种技术何时更适合使用.
我无法理解这个和下面的例子之间的区别
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
Run Code Online (Sandbox Code Playgroud)
或由Stephen Toub解释的ForEachAsync - http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx
编辑:发现一篇来自Stephen Toub的博客文章解释"按完成排序"<=>"处理任务完成后".值得阅读.阅读本文后,我可以清楚地了解它的工作原理以及何时使用这种技术.
我有一个 Parallel.ForEach 循环,它循环遍历一个集合。在内部,我进行了多次网络 I/O 调用的循环。我使用了 Task.ContinueWith 并嵌套了后续的 async-await 调用。处理的顺序无关紧要,但每个异步调用的数据都应该以同步方式处理。含义 - 对于每次迭代,从第一个异步调用中检索到的数据应该传递给第二个异步调用。在第二个异步调用完成后,来自两个异步调用的数据应该一起处理。
Parallel.ForEach(someCollection, parallelOptions, async (item, state) =>
{
Task<Country> countryTask = Task.Run(() => GetCountry(item.ID));
//this is my first async call
await countryTask.ContinueWith((countryData) =>
{
countries.Add(countryData.Result);
Task<State> stateTask = Task.Run(() => GetState(countryData.Result.CountryID));
//based on the data I receive in 'stateTask', I make another async call
stateTask.ContinueWith((stateData) =>
{
states.Add(stateData.Result);
// use data from both the async calls pass it to below function for some calculation
// in a synchronized way (for …Run Code Online (Sandbox Code Playgroud) c# asynchronous task-parallel-library async-await parallel.foreach
我有一个代理列表,每个代理进入各个站点并从站点中提取所需的数据.目前它一次只做这个.但我希望一次运行10到20个任务,因此它可以一次性从20个站点下载,而不只是一个.
这是我目前正在做的事情:
private async Task<string> DownloadDataFromSite(string url)
{
// (await) Do Work.
return HTMLSourceCode;
}
Run Code Online (Sandbox Code Playgroud)
然后我循环遍历代理
foreach(Proxy p in proxies)
{
string source = await DownloadDataFromSite(site);
}
Run Code Online (Sandbox Code Playgroud)
是Parallel.ForEach适合这样的任务?我试过了,但我现在遇到的问题是无法做到的await.