gpt4 book ai didi

c# - 线程池、多线程、异步等,我该用什么?

转载 作者:行者123 更新时间:2023-11-30 22:13:16 25 4
gpt4 key购买 nike

我的场景:

  • 我有一个应用程序,人们可以在其中输入项目 ID 列表。
  • 对这些项目中的每一个都运行网络服务操作
  • DataGridView 绑定(bind)到类的某些 BindingList/ObservableCollection 并在每个操作完成时更新
  • 可能还会有一个状态标签,告知用户完成了多少项目。
  • 输入列表实际上可以是任何大小,但上限可能在 500 左右。

我应该采用什么解决方案?线程池?根据需要创建/销毁线程?我已经编写了大部分代码,但需要搜索/更新不在 UI 线程上。从哪里开始比较好?

编辑:我必须使用 .NET 3.5,不能使用 async/await 之类的东西 :(

最佳答案

一般来说,这听起来像是基于语言的 async/await关键字可能是最佳选择,原因有二:

  • An operation on a web service is run on each of these items

鉴于这是一个网络服务调用,它自然会是 IO 绑定(bind)和异步的。使用 TPL 或其他例程(不小心)可能会降低整体吞吐量。通常,您希望这些操作保持异步,并且如果您从一开始就以这种方式对待它们,它们将实现最佳扩展。

  • A DataGridView is bound to some BindingList/ObservableCollection of classes and updates upon completion of each operation
  • There might also be a status label informing the user how many items have completed.

鉴于您将 UI 控件绑定(bind)到结果,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...
}

关于c# - 线程池、多线程、异步等,我该用什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19232857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com