Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在foreach循环中使用asyn wait_C#_Async Await_Task Parallel Library - Fatal编程技术网

C# 在foreach循环中使用asyn wait

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

在foreach循环中使用asyc WAIT是否不正确?我收到一个WebException,请求被取消

下面是我正在编写的代码的概要。如果不清楚,请告诉我

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
时(请参见示例)