我正在玩弄 .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()
行为应如下所示:
所有排队到返回调度程序的 Task 实例都将通过在该上下文中调用 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 上的异步编程的理解。