Сообщение Объясните поведение ContinueWith(..., TaskContinuationOption от 02.01.2017 11:15
Изменено 02.01.2017 20:19 AndrewVK
Объясните поведение ContinueWith(..., TaskContinuationOptions.ExecuteSynchronous
Не понимаю логики поведения сабжа.
Такой пример:
вывод:
в зависимости от третьей выделенной строки (наличия ее или длительности паузы в ней) вывод может дополняться
но никогда не ожидаемым:
Вопрос: чем эти два ContinueWith отличаются, что поведение такое разное?
Такой пример:
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 отличаются, что поведение такое разное?
Объясните поведение ContinueWith(..., TaskContinuationOption
Не понимаю логики поведения сабжа.
Такой пример:
вывод:
в зависимости от третьей выделенной строки (наличия ее или длительности паузы в ней) вывод может дополняться
но никогда не ожидаемым:
Вопрос: чем эти два ContinueWith отличаются, что поведение такое разное?
Такой пример:
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 отличаются, что поведение такое разное?