HttpClient async - слишком быстрый пропуск запросов веб-сервиса - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема, когда я перебираю около 31 URL-адреса веб-службы. Если я добавлю Thread.Sleep(1000) в верхний код, он будет работать отлично, но если я уберу это, я получу успех только на 10 (иногда меньше, а иногда и больше) из 31 запроса. Как заставить его ждать?

Код

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

                     }
                }
            }
         }

Как это может выглядеть enter image description here

1 Ответ

0 голосов
/ 29 октября 2018

Вы должны использовать 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 внутри цикла.

...