大佬教程收集整理的这篇文章主要介绍了为什么在使用当前同步上下文启动任务时,不设置ASP.NET HttpContext.Current,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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()任务调度程序时,上下文应该还原。那为什么不在这里? (我可以,btw,看到代理在同一个线程上同步执行)。
另外,从msdn起,Taskscheduler.FromCurrentSynchronizationContext()的行为如下:
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上如何增加对异步编程的理解。
在第二种情况下,当您使用SychronizationContext(参见:MSDN Article)时,线程的上下文与任务共享:
在这种情况下,SynchronizationContext.Current由LegacyAspNetSychronizationContext提供,内部引用了httpApplication。
当Post方法必须调用注册的回调时,它调用httpApplication.onThreadEnter,这最终导致当前线程的上下文设置为httpCurrent.Context:
这里引用的所有类在框架中被定义为内部,并且使得进一步的调查有点难。
PS:说明SynchornizationContext对象实际上指向“LegacyAspNetSynchronizationContext”:
以上是大佬教程为你收集整理的为什么在使用当前同步上下文启动任务时,不设置ASP.NET HttpContext.Current全部内容,希望文章能够帮你解决为什么在使用当前同步上下文启动任务时,不设置ASP.NET HttpContext.Current所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。