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
和同步上下文感知延续(akaawait
)将自动保留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)=============>