Почему TaskFactory.StartNew в сочетании с Task.ContinueWith работает? - PullRequest
4 голосов
/ 26 октября 2011

TaskFactory.StartNew () создает новую задачу, запускает ее и затем возвращает. Я предполагаю, что можно с уверенностью предположить, что следующий код всегда будет работать (так как он был взят из MSDN):

Task.Factory.StartNew(() => Console.WriteLine("first"))
   .ContinueWith(antecendent => Console.WriteLine("second"));

Как это работает? Как я могу быть уверен, что задание не было запущено (или даже завершено) до вызова .ContinueWith()?

1 Ответ

3 голосов
/ 26 октября 2011

TPL предназначен для абстрагирования асинхронного характера задач от потребителя, поэтому, если вы вызовете ContinueWith для завершенной задачи, то обработчик антецедента будет вызван немедленно.

Это означает, что вы можетесоздайте Task с TaskFactory.StartNew (который запланирует выполнение задачи асинхронно) или new Task(() => { /*...*/}) с последующим task.RunSynchronously(), и вы всегда можете вызвать ContinueWith на Task.По сути, это означает «запланировать запуск этой программы после завершения задачи или сейчас, если она уже завершена».

...