ASP.NETmultithreadingWeb请求

我正在我的ASP.NET解决方案中构建一个页面,该页面从第三方API服务中检索大部分数据。

页面本身需要对API进行大约5次单独的不同调用以填充其所有控件,因为每个API请求都会返回不同的数据集。

我想同时处理我在新线程上发出的每个单独的Web请求,以便减少加载时间。

我正在制作的每个请求都是这样的: –

WebRequest request = WebRequest.Create(requestUrl); string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); return new JsonSerializer().Deserialize(new JsonTextReader(new StringReader(response))); 

首先,我应该尝试这个吗? 即,它安全吗? 并且它会通过multithreading来提高性能。

其次,这样做的最佳方法是什么? multithreading系统有许多不同的方法,但最适合这项任务的是什么?

multithreading是正确的选择,但我会称之为异步执行

无论如何,您应该知道IIS中的multithreading工作方式不同。

所有子线程结束后,IIS工作进程将完成一个请求,这是一个大问题,因为您不希望长时间保持工作进程,而是将其重新用于其他请求。 实际上它是一个线程池。

这就是ASP.NET提供自己的实现异步方法的原因,如果使用正确的方法,IIS将能够一次处理更多请求,因为异步工作将在IIS进程模型之外执行。

我建议你阅读有关ASP.NET异步的更多信息:

结论:使用异步工作,这将更有效地使用服务器资源,但首先要了解如何以正确的方式执行它!

不建议在ASP.NET上进行multithreading处理 ; 因为ASP.NET / IIS会自己进行multithreading处理,而你所做的任何multithreading都会干扰这些启发式算法。

您真正想要的是并发性 ,更具体地说是异步并发,因为您的操作受I / O限制。

最好的方法是使用HttpClient和基于任务的异步模式 :

 public async Task GetOccupationAsync(string requestUrl) { // You can also reuse HttpClient instances instead of creating a new one each time using (var client = new HttpClient()) { var response = client.GetStringAsync(requestUrl); return new JsonSerializer().Deserialize(new JsonTextReader(new StringReader(response))); } } 

这是异步的,您可以使用Task.WhenAll轻松地使其变得Task.WhenAll

 List urls = ...; OccupationSearch[] results = await Task.WhenAll(urls.Select(GetOccupationAsync)); 

我认为multithreading(在合理范围内)将提供好处,因为编写代码的方式知道对GetResponse()的调用.GetResponseStream()是阻塞的。

提高性能的最简单方法之一是使用Parallel.ForEach :

  var urls = new List(); var results = new ConcurrentBag(); Parallel.ForEach(urls, url => { WebRequest request = WebRequest.Create(requestUrl); string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); var result = JsonSerializer().Deserialize(new JsonTextReader(new StringReader(response))); results.Add(result); }); 

如果您使用的是.NET 4.5,则新方法是使用async / await。 Msdn在这里有一篇非常广泛的文章: http : //msdn.microsoft.com/en-us/library/hh300224.aspx和http://msdn.microsoft.com/en-us/library/hh696703。 ASPX

Scott Hanselman也有一个关于这个主题的好博文章: http : //www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx