C# HttpContext.async任务内当前为空

C# HttpContext.async任务内当前为空,c#,ninject,async-await,httpcontext,C#,Ninject,Async Await,Httpcontext,我有一个使用存储库的方法(userRepo): 我已尝试将此设置添加到web.config: <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> <httpRuntime targetFramework="4.5" /> 另外,我肯定在使用.NET4.5。这也在my web.config中: <add key="aspnet:UseTaskFriendlySynchr

我有一个使用存储库的方法(
userRepo
):

我已尝试将此设置添加到web.config:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<httpRuntime targetFramework="4.5" />

另外,我肯定在使用.NET4.5。这也在my web.config中:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<httpRuntime targetFramework="4.5" />

在启动任务之前,无法从
HttpContext
获取信息,因为任务中
userRepo
的依赖关系正在使用该信息,并且两个对象都使用Ninject解析

如何确保
HttpContext.Current
不会为空?

此处的“任务友好型同步上下文”适用于
wait
的延续:无论您如何处理
结果
,它都将具有http上下文。但是,它与
任务.Start
无关。这与同步上下文相关,而不是与同步上下文相关

基本上,通过对一个工作者执行此操作,您(在过程中,结果)将该工作者与http上下文分离。您必须:

  • 从http上下文中获取所需的信息并将其传递给worker,或者
  • 不要使用工人
就我个人而言,我怀疑你把这件事推到一个工人身上会有多大收获。如果您真的想采用
async
,理想的做法是让您的回购在内部支持
*async
方法。这需要的不仅仅是使用线程:它通常意味着架构更改,例如,使用异步SQL方法。从头编写的东西使用
async
和同步上下文感知延续(aka
await
)将自动保留http上下文之类的内容

这里的重要区别在于
异步
/
等待
实现是线性的,但不是连续的,即

 <===(work)==>
                    <===(callback; more work)===>
                                                     <===(another callback)===>

当您的现有代码可能并行执行时,即



async
/
await
方法基本上是线性的,这使得它更适合访问http上下文之类的内容,因为它知道(正确完成)一次只有一个线程访问它——即使它不是相同的线程端到端

“如何确保
HttpContext.Current
不会为空?”根本不要使用
Task
s或
async
-
await
。在这种情况下,它不会改善任何情况。@svick好吧,
await
至少是http上下文感知的;这里的问题是
任务。Start
不是。Link:
<==========(original work)=================>
         <===========(task on worker thread)=============>