При попытке найти новый (возможно, не такой новый, но новый для меня, во всяком случае) асинхронное программирование Task
на С#, я столкнулся с проблемой, которая меня немного разобрала, и я не знаю почему.
Я исправил проблему, но я все еще не уверен, почему это было проблемой для начала. Я просто подумал, что поделюсь своим опытом, если кто-то там столкнется с той же ситуацией.
Если какие-либо гуру хотели бы сообщить мне о причине проблемы, это было бы замечательно и высоко оценено. Мне всегда нравится знать, почему что-то не работает!
Я выполнил тестовую задачу следующим образом:
Random rng = new Random((int)DateTime.UtcNow.Ticks);
int delay = rng.Next(1500, 15000);
Task<Task<object>> testTask = Task.Factory.StartNew<Task<object>>(
async (obj) =>
{
DateTime startTime = DateTime.Now;
Console.WriteLine("{0} - Starting test task with delay of {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (int)obj);
await Task.Delay((int)obj);
Console.WriteLine("{0} - Test task finished after {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (DateTime.Now - startTime).TotalMilliseconds);
return obj;
},
delay
);
Task<Task<object>>[] tasks = new Task<Task<object>>[] { testTask };
Task.WaitAll(tasks);
Console.WriteLine("{0} - Finished waiting.", DateTime.Now.ToString("h:mm:ss.ffff"));
// make console stay open till user presses enter
Console.ReadLine();
И затем я запустил приложение, чтобы увидеть, что он выплюнул. Вот несколько примеров:
6: 06: 15.5661 - Запуск тестовой задачи с задержкой 3053 мс.
6: 06: 15.5662 - Завершение ожидания.
6: 06: 18.5743 - тестовое задание завершено после 3063.235мс.
Как вы можете видеть, оператор Task.WaitAll(tasks);
мало что сделал. Он ждал всего 1 миллисекунду, прежде чем продолжить выполнение.
Я ответил на свой "вопрос" ниже - но, как я сказал выше, - если кто-нибудь более осведомлен, чем я хотел бы объяснить, почему это не работает, сделайте это!
(Я думаю, что это может иметь какое-то отношение к выполнению "пошагового" метода после того, как он достигает оператора await
, а затем отступит назад, как только ожидание будет выполнено... Но я, вероятно, ошибаюсь)