Почему будет deadlock?
От: Sharov Россия  
Дата: 20.01.20 13:03
Оценка:
Здраствуйте.

Имеется сл. код на шарпе:

private static async void Test()
{
            var tcs = new TaskCompletionSource<int>();
            var task = Task.Factory.StartNew(() =>
            {
                Thread.Sleep(1000);
                tcs.SetResult(10);
                Console.WriteLine("here3");
            });

            await tcs.Task; //1
            task.Wait(); //1
            //await tcs.Task.ContinueWith(t => task.Wait());//2


            Console.WriteLine("here1");
}


Данный код виснет, т.к. task.Wait() tcs.SetResult() оказываются на одном стеке (соотв. в одном потоке).
Более того, никакие опции типа TaskCreationOptions.LongRunning | TaskCreationOptions.RunContinuationsAsynchronously не помогают.
Почему так? Т.е. почему все оказалось за инлайнено? Если закомментировать //1 и раскомментировать //2 то все ожидаемо работает...
Есть какая-то спецификация на это поведение, как глядя на данный код можно понять, что здесь deadlock?

Заранее благодарю.
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.