Я выполняю набор команд 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.Может кто-нибудь помочь мне понять, что здесь происходит?