При попытке выяснить новый (может быть, не такой новый сейчас, но новый для меня, так или иначе) Task
асинхронное программирование на C#, я столкнулся с проблемой, которая меня немного выяснить, и я не уверен, почему.Task.WaitAll не дожидаясь завершения задачи
Я исправил проблему, но я до сих пор не уверен, почему это была проблема для начала. Я просто подумал, что поделюсь своим опытом, если кто-то там столкнется с той же ситуацией.
Если какие-либо гуру хотели бы сообщить мне о причине проблемы, это было бы замечательно и высоко оценено. Мне всегда нравится знать только , почему что-то не работает!
Я сделал тестовую задачу следующим образом:
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
оператора - то отступая в ожидании после того, как это делается ... Но я, наверное, неправильно)
Почему вы делаете 'новый случайным ((INT) DateTime.UtcNow.Ticks)'? Почему бы не просто «new Random()», поскольку это фактически одно и то же. – Enigmativity
Не важно, чтобы это было важно или имело отношение к этому вопросу вообще, но чисто для того, чтобы увидеть, какая, если таковая имеется, разница. Я не заметил никакой разницы в вызове конструктора без параметров, поэтому я просто сделаю это с этого момента. Вы ничего не узнаете, если не попробуете новые вещи. Программирование - это хобби для меня, у меня не было никакого формального образования, кроме Karel the Robot, Pascal и SQL, и это было 13 лет назад, поэтому для меня важно, чтобы я возился, пробовал вещи, ломал вещи, фигурировал их и учиться. – cjk84
Вам будет лучше загружать один из бесплатных декомпиляторов .NET и посмотреть на источник. – Enigmativity