如何在C#中发出多个带有延迟的异步HTTP请求

时间:2018-10-05 21:06:26

标签: c# .net async-await

我正在嵌入式平台上执行一组HTTP API命令,但需要增加延迟以确保最终的GPIO操作正确计时。我遵循了StackOverflowMicrosoft的几个示例,但是仍然有奇怪的行为。

我在一组动作中读取了一组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" />

一旦读取,处理程序就会使用Task.WhenAll启动对ProcessHttpCallWithDelay方法的一组调用:

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方法返回完成。有人可以帮助我了解这里的情况吗?

0 个答案:

没有答案