C# 在foreach循环中使用asyn wait
在foreach循环中使用asyc WAIT是否不正确?我收到一个WebException,请求被取消 下面是我正在编写的代码的概要。如果不清楚,请告诉我C# 在foreach循环中使用asyn wait,c#,async-await,task-parallel-library,C#,Async Await,Task Parallel Library,在foreach循环中使用asyc WAIT是否不正确?我收到一个WebException,请求被取消 下面是我正在编写的代码的概要。如果不清楚,请告诉我 using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://xxx.xxx.com/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequest
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://xxx.xxx.com/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
var response = await client.PostAsJsonAsync("customers/xxxx/xxx/documents", requestMessage);
response.EnsureSuccessStatusCode();
var returnValue = response.Content.ReadAsAsync<ResponseMessage>();
var hasDocuments = returnValue.Result.SearchResults.Any();
if (hasDocuments)
{
// HTTP GET
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
returnValue.Result.SearchResults.ForEach(async d =>
{
response = await client.GetAsync(d.Self + ".pdf");
});
}
}
catch (Exception ex)
{
throw;
}
}
使用(var-client=new-HttpClient())
{
client.BaseAddress=新Uri(“https://xxx.xxx.com/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
尝试
{
var response=wait client.postsjsonasync(“customers/xxxx/xxx/documents”,requestMessage);
response.EnsureSuccessStatusCode();
var returnValue=response.Content.ReadAsAsync();
var hasDocuments=returnValue.Result.SearchResults.Any();
if(文件)
{
//HTTP获取
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新MediaTypeWithQualityHeaderValue(“*/*”);
returnValue.Result.SearchResults.ForEach(异步d=>
{
response=wait client.GetAsync(d.Self+“.pdf”);
});
}
}
捕获(例外情况除外)
{
投
}
}
在foreach
循环中,您没有使用async/await,而是与一起使用async/await。因为ForEach
只接受Action
(无效返回类型)您的ForEach(async d=>{…}
正在作为异步无效
函数处理,因为这是将其作为操作
传入的唯一方法。这使ForEach在移动到下一项之前不会等待上一项完成,这就是导致错误的原因
使用普通的foreach
而不是列表。foreach
方法应该可以正常工作
if (hasDocuments)
{
// HTTP GET
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
foreach (var d in returnValue.Result.SearchResults)
{
response = await client.GetAsync(d.Self + ".pdf");
};
}
唯一允许您使用
async d=>…
的时间是当您传入的函数接受Func
(参见示例)时。在foreach
循环中没有使用async/wait,您使用的是async/wait with。因为foreach
只接受操作
(无效返回类型)您的ForEach(async d=>{…}
正在作为async void
函数进行处理,因为这是将其作为操作
传入的唯一方法。这使得ForEach在移动到下一项之前不会等待上一项完成,这就是导致错误的原因
使用普通的foreach
而不是列表。foreach
方法应该可以正常工作
if (hasDocuments)
{
// HTTP GET
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
foreach (var d in returnValue.Result.SearchResults)
{
response = await client.GetAsync(d.Self + ".pdf");
};
}
唯一允许您使用async d=>…
的时间是您传入的函数接受Func
时(请参见示例)