Как сделать несколько асинхронных HTTP-запросов с задержками в C # - PullRequest
0 голосов
/ 06 октября 2018

Я выполняю набор команд HTTP API на нашей встроенной платформе, но мне нужно добавить задержки, чтобы гарантировать правильную синхронизацию возможных операций GPIO.Я следовал за несколькими примерами из StackOverflow и Microsoft , но продолжаю вести себя странно.

Я читаю набор команд XML в списокДействия.

<action url="http://10.10.5.112/api/analogoutputs/0/3" delay="0"/>
<action url="http://10.10.5.112/api/analogoutputs/1/6" delay="5" />
<action url="http://10.10.5.112/api/analogoutputs/2/9" delay="10" />
<action url="http://10.10.5.112/api/analogoutputs/3/12" delay="15" />

После прочтения программа обработки инициирует набор вызовов метода ProcessHttpCallWithDelay, используя Task.WhenAll:

IEnumerable<Task<bool>> httpCalls = 
  from Action in LogicActions
  select ProcessHttpCallWithDelay(Action.url, Action.delay);
// Make array of http calls
Task<bool>[] httpCallsArray = httpCalls.ToArray();
// Await the completion of all of the http calls
bool[] results = await Task.WhenAll(httpCallsArray);
// Process results
... do something with results ..

Метод обработки HTTP API:

    private async Task<bool> ProcessHttpCallWithDelay(string url, int delay)
    {
        bool ok = true;
        try
        {
            await Task.Delay(delay*1000);
            WebRequest request = WebRequest.Create(url);
            request.ContentType = "application/json";
            HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
            string returnString = response.StatusCode.ToString();
            response.Close();
        }
        catch (Exception ex)
        {
            ok = false;
        }

        return ok;
    }

Проблема в том, что ожидающий Task.WhenAll (httpCallsArray) не ожидает завершения всех задач и переходит к этапам обработки, а команда HTTP фактически не отправляется.

Если я выполняю Task.WhenAll (httpCalls), используя IEnumerable, я получаю одну http-команду для выполнения, но ожидание для всех задач не ждет и переходит к шагу обработки.

Я бы ожидал, что в обоих случаях будет ждать завершения всех WebResponses и возвратов из метода ProcessHttpCallWithDelay.Может кто-нибудь помочь мне понять, что здесь происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...