为什么在使用当前同步上下文启动任务时,不设置ASP.NET HttpConte
我正在玩.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()任务调度程序时,上下文应该还原。那为什么不在这里? (我可以,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上如何增加对异步编程的理解。 解决方法
你的看法似乎是正确的,这有点令人费解。
您将调度程序指定为“TaskScheduler.FromCurrentSynchronizationContext()”。这将关联一个新的“SynchronizationContextTaskScheduler”。现在,如果你看这个类,它使用:
在第二种情况下,当您使用SychronizationContext(参见:MSDN Article)时,线程的上下文与任务共享:
在这种情况下,SynchronizationContext.Current由LegacyAspNetSychronizationContext提供,内部引用了HttpApplication。 当Post方法必须调用注册的回调时,它调用HttpApplication.OnThreadEnter,这最终导致当前线程的上下文设置为HttpCurrent.Context: 这里引用的所有类在框架中被定义为内部,并且使得进一步的调查有点难。 PS:说明SynchornizationContext对象实际上指向“LegacyAspNetSynchronizationContext”: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 作为静态文件的根目录的项目子目录
- asp.net – 如何在WebControls和HtmlControls上执行相同的操
- asp.net-web-api – 如何设置Elmah与ASP.NET Web API
- asp.net-mvc-2 – 为什么我们在ASP.NET MVC中使用HTML助手?
- asp.net-mvc – VS 2012中缺少“Browse With …”按钮
- 在ASP.NET 2.0中的特定时间清除缓存
- 构建ASP.NET应用程序 – 最佳实践
- ASP.Net MVC身份无限重定向循环
- asp.net-mvc – 如何使用ASP.NET MVC实现自定义缓存提供程序
- asp.net-mvc – 优化性能或属性路由和路由表
- asp.net-mvc – !ClrStack -a调用ASP.NET MVC应
- 在ASP.NET 5 / Core 1.0开发期间使用完整的IIS
- 如何从ASP.NET Web API返回已排序的字典
- asp.net-mvc – .NET MVC的简单OpenID身份验证代
- asp.net-mvc – 如何使用post或get来检查控制器是
- asp.net-web-api – 从局域网中的其他计算机使用
- asp.net-mvc – ASP.NET MVC 3 RC和Azure?
- asp.net – SQL Server应用程序角色,性能命中
- asp.net-mvc – 如何使用MSBuild部署一个ASP.NET
- asp.net – Web API 2 – ApiController.Interna