почему awaiter.IsCompleted всегда возвращает false? - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в. NET и пишу программу для тестирования. Прямо сейчас я использую TaskAwaiter, и когда я получаю awaiter из его экземпляра, он всегда возвращает false на awaiter.IsCompleted, и я не знаю почему и как это исправить? Я использую это неправильно?

TaskAwaiter<HttpResponseMessage> awaiter;
str = "login.action";
awaiter = client.client.GetAsync(str).GetAwaiter();
if (awaiter.IsCompleted)
{
  break;
}

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Я использую это неправильно?

Вы предполагаете, что HTTP-запрос происходит немедленно. Это не вариант. Вы должны ждать его.

Существуют крайние случаи, когда вызываемый асинхронный метод c может не быть асинхронным c - т.е. возвращает кэшированный результат - и это ТОЛЬКО случаи, когда вы получите IsCompleted = правда сразу после звонка.

1 голос
/ 01 мая 2020

Похоже, у вас нет правильного определения цикла. Это должно быть примерно так:

TaskAwaiter<HttpResponseMessage> awaiter;
str = "login.action";
awaiter = client.client.GetAsync(str).GetAwaiter();
while (true)
{
  if (awaiter.IsCompleted)
  {
    break;
  }
}

Или лучше написать так: while (!awaiter.IsComleted) {}

Или лучше использовать ключевые слова async/await. Например:

public async Task YourMethodName()
{
  ...
  str = "login.action";
  HttpResponseMessage response = await client.client.GetAsync(str);
  ...
}
...