【问题标题】:Asynchronous I/O with multiple thread C# [duplicate]具有多线程 C# 的异步 I/O [重复]
【发布时间】:2012-10-17 19:46:12
【问题描述】:

可能重复:
How to limit the amount of concurrent async I/O operations?

假设我有一个字符串数组

string[] domains = { "domain1.com", "domain2.com" ,..., "domain100.com"};

我想编写一个使用 5 个线程向这些域发送请求并将响应标头按启动顺序保存到同一日志文件的应用程序。例如:

Thread 1
domain1.com
Response header


Thread 2
domain2.com
Response header


Thread 3
domain3.com
Response header

Thread 4
domain4.com
Response header


Thread 5
domain5.com
Response header


Thread 1
domain6.com
Response header

Thread 2
domain7.com
Response header

我是多线程编程的新手,所以希望你能帮助我。非常感谢

【问题讨论】:

  • 为什么要用5个线程来做这个?异步 IO 意味着您无需过多考虑线程,因为 .net 将在 ThreadPool 中安排任何回调。您是否只想限制 5 个并发下载?
  • 并且在 C# 5 中使用新的 async 支持将比多线程更高效,并且更容易正确处理,因为您不必处理同步和潜在的竞争条件。跨度>

标签: c# multithreading asynchronous


【解决方案1】:

您不需要关心在后台创建了多少线程,线程池会为您优化线程创建,您的代码可能如下所示:

string[] domains = { "domain1.com", "domain2.com",...., "domain100.com" };

var client = new HttpClient();
var tasks = domains.Select(domain => client.GetAsync(domain)
                               .ContinueWith(task =>
                               {
                                   HttpResponseMessage response = task.Result;
                                   var headers = response.Headers;
                                   //Write to log file
                               }));

await Task.WhenAll(tasks);

【讨论】:

    【解决方案2】:

    我会使用 RX 扩展。

    Paul Betts 对 RX 扩展有一个很好的概述,他在今年早些时候的 NDC 会议上准确地解决了您的问题。

    视频可在NDC website 获得

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2011-10-02
      • 2016-07-11
      • 2011-11-25
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多