Task.Delay() не ведет себя так, как ожидалось, или, скорее, я не понимаю, что он должен делать. Я пытаюсь окунуться в Task
в С# и как заменить Thread
в моей реализации.
То, что я пытаюсь сделать, это примерно так:
- Пока верно
- напечатать строку
- подождите секунду,
- Если условие выполнено, цикл выхода, в противном случае сохранить цикл
У меня это реализовано с помощью Threads отлично, но все классные дети говорят, что я должен использовать Task и не трогать Thread.
Итак, для кода у меня есть это (Игнорировать [Test]
- это просто удобный способ опробовать вещи)
[Test]
public void ChattyTask()
{
var chattyTask = new Task(ChattyWriter);
chattyTask.Start();
chattyTask.Wait();
}
public void ChattyWriter()
{
int count = 0;
while (true)
{
var message = String.Format("Chatty Writer number {0}", count);
Trace.WriteLine(message);
count++;
Task.Delay(1000);
if (count >= 20)
{
break;
}
}
}
Когда я запускаю это, тест заканчивается в миллисекундах, а не через 20 секунд, как я ожидал. Если я заменяю Task.Delay()
на Thread.Sleep()
, все работает так, как ожидалось, и я получаю распечатку один раз в секунду. Я попытался добавить async
и await
в ChattyWriter()
, но не только не добавил 1 секунду задержки, он печатал только одну строку вместо 20.
Что я делаю неправильно?
Вероятно, это поможет описать, что я делаю: мой проект работает с внешним API (RESTful), и после запроса некоторых задач мне нужно опросить API, чтобы проверить, завершена ли задача. Внешние задачи могут быть длительными: 1-15 минут. Так что мне нужна задержка между проверкой на завершение. И может быть много разных параллельных процессов, выполняемых с несколькими внешними задачами. Я понимаю, что если я использую Thread.Sleep()
при опросе, другие процессы на одном и том же Thread
будут заблокированы без уважительной причины.