线程池、多线程、异步等.我应该使用什么

本文关键字:我应该 什么 异步 多线程 线程 | 更新日期: 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...
}