Сообщение Re: Почему будет deadlock? от 20.01.2020 14:22
Изменено 20.01.2020 14:33 alexander_r
Re: Почему будет deadlock?
Здравствуйте, Sharov, Вы писали:
S>Здраствуйте.
S>Имеется сл. код на шарпе:
S>
S>Данный код виснет, т.к. task.Wait() tcs.SetResult() оказываются на одном стеке (соотв. в одном потоке).
S>Более того, никакие опции типа TaskCreationOptions.LongRunning | TaskCreationOptions.RunContinuationsAsynchronously не помогают.
S>Почему так? Т.е. почему все оказалось за инлайнено? Если закомментировать //1 и раскомментировать //2 то все ожидаемо работает...
S>Есть какая-то спецификация на это поведение, как глядя на данный код можно понять, что здесь deadlock?
S>Заранее благодарю.
просто await task;
ну или .ContinueWith(t => task.Wait())
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;
ну или .ContinueWith(t => task.Wait())
просто 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())