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
支持将比多线程高效得多,而且更容易正确操作,因为您不必处理同步和潜在的竞争条件。