我的.Net和Java应用程序需要向Web服务发出许多同时请求,这需要很长的时间来回复。因此,任何时候都可能有数千个未完成的HTTP请求。为了实现这一点,我可以让一个线程生成许多异步HTTP请求并处理响应,但我想了解任何允许同步HTTP请求的替代方案,而不需要使用数千个线程,因为相关的资源成本。任何解决方案都必须避免线程被阻塞等待HTTP响应。
我的问题分为两部分:
1)可以使用Threadpool来做到这一点吗?我知道我可以在线程池队列中排队我的作业,并且线程池将在它能够处理时处理它们但线程池工作线程是否可以避免被阻塞等待http响应?他们可以在等待的时候去处理其他工作吗?
2)在保持HTTP同步API调用的简单性的同时,还有其他方法可以实现这一点。
此致
答案 0 :(得分:1)
可以使用Threadpool来执行此操作吗?
他们自己,没有。
还有其他方法可以实现这一点,同时保留HTTP同步API调用的简单性。
您是在谈论客户端 HTTP调用API吗?如果是这样,可以通过使用异步服务器端实现来实现此目的。
答案 1 :(得分:1)
任务不会产生额外的线程,所以你保存了性能命中,并且它们不会阻塞调用线程,因此我相信这将满足这两种需求。
string[] urls = GetUrls();
var requests = new Dictionary<string, Task<string>>()
var responses = new Dictionary<string, string>();
// send off each request and store the on-going task in a dictionary
foreach (string url in urls)
requests.Add(url, Task.Factory.StarNew(() => return WebClient.DownloadString(url))
// get the results asynchronously
Task.Factory.StartNew(() => {
foreach (var request in requests)
responses.Add(request.key, request.Result)
}
现在当你得到回复时,你可以通过几种方式来做到这一点。以上将逐个获得每个任务的结果。当您调用result时,它将等待任务完成,阻止调用方法,并且如果任务出现故障,此时将抛出异常。您还可以使用Task.WaitAll()立即等待整个批处理;由于调用.Result会阻止调用方法,因此您还必须从任务内部检索结果。
该示例假定您发送HTTP-GET并希望将结果作为字符串,但无论您使用何种HTTP方法或结果,您进行调用并获得结果的方式都是相同的。您还希望添加异常处理以捕获可能引发的任何异常。您可以准备好处理任务异常处理here。