线程池、多线程、异步等.我应该使用什么
本文关键字:我应该 什么 异步 多线程 线程 | 更新日期: 2023-09-27 18:34:21
我的场景:
- 我有一个应用程序,人们在其中输入项目 ID 列表。
- 对其中每个项运行 Web 服务上的操作
- DataGridView 绑定到类的某个 BindingList/Observable集合,并在完成每个操作后进行更新
- 可能还会有一个状态标签,通知用户已完成的项目数。
- 输入列表实际上可以是任何大小,但可能会限制在 500 左右。
我应该采用什么解决方案?线程池?根据需要创建/销毁线程?我已经编写了大部分代码,但需要搜索/更新才能不在 UI 线程上。哪里是一个好的起点?
编辑:我必须使用.NET 3.5,不能使用async/await之类的东西:(
一般来说,这听起来像是基于语言的async
/await
关键字可能是最佳选择,原因有两个:
- 对其中每个项运行 Web 服务上的操作
鉴于这是一个 Web 服务调用,它将自然是 IO 绑定和异步的。 使用 TPL 或其他例程(不小心(可能会降低整体吞吐量。 通常,你希望这些操作保持异步,并且如果从一开始就以这种方式处理它们,则缩放效果最佳。
- DataGridView 绑定到类的某个 BindingList/Observable集合,并在完成每个操作后进行更新
- 可能还会有一个状态标签,通知用户已完成的项目数。
假设将 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...
}