Объясните поведение ContinueWith(..., TaskContinuationOption
От: AK107  
Дата: 02.01.17 11:15
Оценка:
Не понимаю логики поведения сабжа.

Такой пример:

            var task = Task.Delay(TimeSpan.FromSeconds(1));

            Console.WriteLine("Task: Delay started.");

            task.ContinueWith(x =>  // 1
            {
                Thread.Sleep(1000);
                Console.WriteLine("\tTask: ContinueWith started.");
                Thread.Sleep(1000);
                Console.WriteLine("\tTask: ContinueWith done.");
            }, TaskContinuationOptions.ExecuteSynchronously);

            Console.WriteLine("WhenAll: started.");
            var whenAll = Task.WhenAll(task);

            whenAll.ContinueWith(x =>  // 2
            {
                Thread.Sleep(1);   // 3
                Console.WriteLine("\tWhenAll: ContinueWith run.");
                Thread.Sleep(1000);
                Console.WriteLine("\tWhenAll: ContinueWith done.");
            }, TaskContinuationOptions.ExecuteSynchronously);

            Console.WriteLine("WhenAll: Wait started.");
            whenAll.Wait();
            Console.WriteLine("WhenAll: Wait done.");


вывод:

Task: Delay started.
WhenAll: started.
WhenAll: Wait started.
Task: ContinueWith started.
Task: ContinueWith done.
WhenAll: Wait done.



в зависимости от третьей выделенной строки (наличия ее или длительности паузы в ней) вывод может дополняться

WhenAll: ContinueWith run.


но никогда не ожидаемым:

WhenAll: ContinueWith run.
WhenAll: ContinueWith done.



Вопрос: чем эти два ContinueWith отличаются, что поведение такое разное?
Отредактировано 02.01.2017 20:19 AndrewVK . Предыдущая версия .
continuewith tpl
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.