一般来说,这听起来像是基于语言的async
/await
关键字可能是最好的选择,原因有两个:
鉴于这是一个 Web 服务调用,它自然是 IO 绑定和异步的。使用 TPL 或其他例程(不小心)可能会降低整体吞吐量。通常,您希望这些操作保持异步,并且如果您从一开始就以这种方式对待它们,则可以实现最佳扩展。
- DataGridView 绑定到某些类的 BindingList/ObservableCollection,并在每个操作完成后更新
- 还可能有一个状态标签,通知用户已经完成了多少项目。
鉴于您将 UI 控件绑定到结果,将调用映射回调用同步上下文的async
/支持将简化将结果添加到集合中的过程。await
这将使代码在其最终状态下保持非常简单。
请注意,您可能希望存储Task<T>
异步操作返回的值,然后等待返回的值(而不仅仅是直接等待消息调用)。这将允许您同时触发对服务的多个请求。例如,您的代码可能看起来像(*没有异常处理等):
// Start each operation, and store in a list
var asyncOperations = ids.Select(id => FetchDataFromWebServiceAsync(id)).ToList();
while (asyncOperations.Any())
{
// When one operation completes, remove it from the list of ops running
var completed = await Task.WhenAny(asyncOperations);
asyncOperations.Remove(completed);
// Grab the result and use
YourResultType finished = completed.Result;
// Add to UI, update progress, etc...
}