Я немного поиграл с асинхронными функциями .NET и придумал ситуацию, которую я не мог объяснить. При выполнении следующего кода внутри синхронного ASP.NET MVC-контроллера
var t = Task.Factory.StartNew(()=>{
var ctx = System.Web.HttpContext.Current;
//ctx == null here
},
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext()
);
t.Wait();
ctx
null
внутри делегата. Теперь, насколько я понимаю, контекст должен быть восстановлен при использовании планировщика задач TaskScheduler.FromCurrentSynchronizationContext()
. Так почему же он не здесь? (Я могу, кстати, видеть, что делегат выполняется синхронно в одном потоке).
Кроме того, из msdn a TaskScheduler.FromCurrentSynchronizationContext()
должен вести себя следующим образом:
Все экземпляры задач, помещенные в очередь для возвращаемого планировщика, будут выполнены через вызов метода Post в этом контексте.
Однако, когда я использую этот код:
var wh = new AutoResetEvent(false);
SynchronizationContext.Current.Post(s=> {
var ctx = System.Web.HttpContext.Current;
//ctx is set here
wh.Set();
return;
},null);
wh.WaitOne();
Фактически задан контекст.
Я знаю, что этот пример немного изобретателен, но мне очень хотелось бы понять, что происходит, чтобы увеличить понимание асинхронного программирования на .NET.