Информация об изменениях

Сообщение Re: Почему будет deadlock? от 20.01.2020 14:22

Изменено 20.01.2020 14:33 alexander_r

Re: Почему будет deadlock?
Здравствуйте, Sharov, Вы писали:

S>Здраствуйте.


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


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

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


S>            Console.WriteLine("here1");
S>}
S>


S>Данный код виснет, т.к. task.Wait() tcs.SetResult() оказываются на одном стеке (соотв. в одном потоке).

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

S>Заранее благодарю.


просто await task;
ну или .ContinueWith(t => task.Wait())
Re: Почему будет deadlock?
Здравствуйте, Sharov, Вы писали:

просто await task;

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
    await task;

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


    Console.WriteLine("here1");
}

ну или .ContinueWith(t => task.Wait())