C# 具有多线程C的异步I/O#

C# 具有多线程C的异步I/O#,c#,multithreading,asynchronous,C#,Multithreading,Asynchronous,可能重复: 假设我有一个字符串数组 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 Respon

可能重复:

假设我有一个字符串数组

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

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

我会使用RX扩展

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


视频在

上可用,我将使用RX扩展

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


视频可在

上获得,您不需要太在意在引擎盖下创建了多少线程,线程池有了它,就可以为您优化线程创建,您的代码可能如下所示:

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);

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

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);

为什么要使用5个线程来执行此操作?异步IO意味着您无需过多考虑线程,因为.net将在线程池中安排任何回调。您只想将并发下载限制在5次吗?在C#5中使用新的
async
支持将比多线程更有效,而且更容易正确操作,因为您不必处理同步和潜在的争用情况。为什么要使用5个线程来实现这一点?异步IO意味着您无需过多考虑线程,因为.net将在线程池中安排任何回调。您只想将并发下载限制在5次吗?在C#5中使用新的
async
支持将比多线程高效得多,而且更容易正确操作,因为您不必处理同步和潜在的竞争条件。