我正在嵌入式平台上执行一组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" />
一旦读取,处理程序就会使用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方法返回完成。有人可以帮助我了解这里的情况吗?