产量平行回报

时间:2017-09-19 00:26:21

标签: c# parallel-processing task-parallel-library yield-return

我有一个网络应用程序,允许用户提交可以有许多长时间运行任务的作业。我使用yield return来允许Web应用程序显示进度条,但这会强制执行同步执行。

我想做的是获取我的任务列表,并行运行它们,但仍然向用户提供反馈。

在下面的代码中,我仍然想在每次调用Infer之后产生返回但我想并行运行循环。如果这对于收益率是不可能的,那么我的选择是什么?

更具体地说,我想要做的是将请求拆分为更小的集合,并使这些较小的集合并行运行。

出于问题的目的,我们可以说我想分开“请求”。进入' requests1'和'要求2'那些然后并行运行但仍然能够在每个项目完成后回复给调用者。

    public IEnumerable<AnnotationRequest> Infer(List<Uri> fileUris, CancellationToken? token)
    {
        var requests = fileUris.Select(uri => new AnnotationRequest() { Uri = uri }).ToList();

        foreach ( var result in Infer(requests, token) )
        {
            yield return result;
        }
    }

1 个答案:

答案 0 :(得分:1)

感谢上面的Peter Duniho评论我按照他的建议实施并且工作正常。

           var collection = new BlockingCollection<AnnotationRequest>();

           Task.Run(() =>
           {
               Parallel.ForEach(requests, (request) =>
              {
                  foreach (var result in Infer(request, token))
                  {
                      collection.Add(result);
                  }
              });

               collection.CompleteAdding();
           });

            foreach (var result in collection.GetConsumingEnumerable())
            {
                yield return result;
            }