HttpClient 异步 - 跳过 Web 服务请求速度太快

问题描述 投票:0回答:1

我遇到一个问题,我循环访问了大约 31 个 Web 服务 URL。 如果我在顶部代码中放置一个

Thread.Sleep(1000)
,它将完美工作,但如果我删除它,我只能在 31 个请求中的 10 个(有时更少,有时更多)请求中获得成功。我如何让它等待?

代码

foreach(var item in ss)
{ 
   //Call metaDataApi(url,conn,name,alias)
}

 public static void metadataApi(string _url, string _connstring, string _spname, string _alias)
        {
           // Thread.Sleep(1000);
            //Metadata creation - Table Creation
            using (var httpClient = new HttpClient())
            {
                string url = _url;

                using (HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult())
                using (HttpContent content = response.Content)
                {
                    Console.WriteLine("CHECKING");
                    if (response.IsSuccessStatusCode)
                    {
                        Console.WriteLine("IS OK");
                        string json = content.ReadAsStringAsync().GetAwaiter().GetResult();

                       //Doing some stuff not relevant

                     }
                }
            }
         }

它看起来怎么样

c# asynchronous dotnet-httpclient
1个回答
0
投票

您应该尽可能使用

async/await
,但您可以尝试这样的方法:

// you should share this for connection pooling  
public static HttpClient = new HttpClient();

public static void Main(string[] args)
{
    // build a list of tasks to wait on, then wait
    var tasks = ss.Select(x => metadataApi(url, conn, name, alias)).ToArray();
    Task.WaitAll(tasks);
}

public static async Task metadataApi(string _url, string _connstring, string _spname, string _alias)
{
    string url = _url;
    var response = await httpClient.GetAsync(url);
    Console.WriteLine("CHECKING");
    if (response.IsSuccessStatusCode)
    {
        Console.WriteLine("IS OK");
        string json = await content.ReadAsStringAsync();

        //Doing some stuff not relevant

    }
}

需要注意的一件事是,这将尝试并行运行多个。如果您需要一个接一个地运行它们,可能需要创建另一个

async
函数来单独等待每个结果并从
Main
调用该函数。
.Result
有点反模式(使用现代 C# 语法,您可以在主函数上使用
async
),但对于您的脚本来说,它应该是“好的”,但我会尽量减少它的使用(因此我不会不要在循环内使用
.Result

© www.soinside.com 2019 - 2024. All rights reserved.