我有一个网络应用程序,允许用户提交可以有许多长时间运行任务的作业。我使用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;
}
}
答案 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;
}