Здраствуйте.
Имеется сл. код на шарпе:
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?
Заранее благодарю.