相关疑难解决方法(0)

何时使用OrderByCompletion(Jon Skeet)和Parallel.ForEach与异步委托

最近,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博客文章解释"按完成排序"<=>"处理任务完成后".值得阅读.阅读本文后,我可以清楚地了解它的工作原理以及何时使用这种技术.

c# async-await c#-5.0

6
推荐指数
1
解决办法
5481
查看次数

Parallel.ForEach 中的多个异步等待链接

我有一个 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

4
推荐指数
2
解决办法
864
查看次数

并行运行多个任务

我有一个代理列表,每个代理进入各个站点并从站点中提取所需的数据.目前它一次只做这个.但我希望一次运行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.

c#

2
推荐指数
1
解决办法
584
查看次数