C#学习教程:HttpClient-发送一批请求foreach(varMyRequestinRequestsBatch){try{HttpClienthttpClient=newHttpClient();httpClient.Timeout=TimeSpan.FromMilliseconds(5);HttpResponseMessageresponse=awaithttpClient.PostAsJsonAsync(string.Format("{0}api/GetResponse",endpoint),myRequest);JObjectresultResponse=awaitresponse.Content.ReadAsAsync();}catch(Exceptionex){继续;}}这里的上下文是我需要设置一个非常小的超时值,所以如果响应时间超过那个时间之后,我们只是得到“任务被取消”的异常并继续迭代。现在,在上面的代码中,注释这两行:HttpResponseMessageresponse=awaithttpClient.PostAsJsonAsync(string.Format("{0}api/GetResponse",endpoint),myRequest);resultResponse=awaitresponse.Content.ReadAsAsync();迭代很快结束。取消注释并重试。这需要很多时间。我想知道使用await调用PostAsJsonAsync/ReadAsAsync方法是否需要比超时值更多的时间?基于下面的答案,假设它会创建不同的线程,我们有这个方法:();httpClient.Timeout=TimeSpan.FromMilliseconds(5);HttpResponseMessageresponse=awaithttpClient.PostAsJsonAsync(string.Format("{0}api/GetResponse",endPoint),request).WithTimeout(timeout);JObjectresultResponse=awaitresponse.Content.ReadAsAsync().WithTimeout(timeout);returnresultResponse;}catch(Exceptionex){returnnewJObject(){newJProperty("ControlledException","无效响应。")};}});}in那里抛出了异常,应该很快就返回了JObjectException,但是,如果使用httpClient方法,即使抛出异常也需要很多时间。是否有任何影响Task的幕后处理,即使返回值是一个简单的exceptionJObject?如果是,可以使用哪种方法非常快速地向API发送一批请求?看起来您实际上并没有为每个请求运行一个单独的线程。尝试这样的事情:vartaskList=newList>();foreach(varmyRequestinRequestsBatch){taskList.Add(GetResponse(endPoint,myRequest));}尝试{Task.WaitAll(taskList.ToArray());}catch(Exceptionex){}publicTaskGetResponse(stringendPoint,stringmyRequest){returnTask.Run(()=>{HttpClienthttpClient=newHttpClient();HttpResponseMessageresponse=httpClient.PostAsJsonAsync(string.Format("{0}api/GetResponse",endpoint),myRequest,newCancellationTokenSource(TimeSpan.FromMilliseconds(5)).Token);JObjectresponse=response.Content.ReadAsAsync();});我同意接受的答案,因为加快速度的关键是并行运行请求。但是任何通过使用Task.Run或Parallel.ForEach强制其他线程混合的解决方案都不会从I/O绑定异步操作中获得任何效率。如果它造成任何伤害。您可以轻松地并发运行所有调用,同时让底层异步子系统决定尽可能高效地完成任务需要多少线程。这个数字可能比并发调用的数量小得多,因为它们在等待响应时根本不需要任何线程。此外,接受的答案会为每次调用创建一个新的HttpClient实例。不要那样做——可能会发生坏事。以下为采纳答案修改版:以上为C#学习教程:HttpClient-发送一批请求分享全部内容,如果对大家有用,需要详细了解C#学习教程,我希望大家多多关注——varhttpClient=newHttpClient{Timeout=TimeSpan.FromMilliseconds(5)};vartaskList=new列表>();foreach(varmyRequestinRequestsBatch){//由于不等待每次调用,您已经实现了并行性taskList.Add(GetResponseAsync(endPoint,myRequest));}try{//异步等待所有任务完成awaitTask.WhenAll(taskList.ToArray());}catch(Exceptionex){}asyncTaskGetResponseAsync(stringendPoint,stringmyRequest){//这里没有Task.Run!varresponse=awaithttpClient.PostAsJsonAsync(string.Format("{0}api/GetResponse",endpoint),myRequest);返回awaitresponse.Content.ReadAsAsync();}收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
