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

    public override Task<IdentityResult> CreateLocalUserAsync(IUser user, string password, CancellationToken cancellationToken)
    {
        var task = new Task<IdentityResult>(() => {

            TUserEntity newUser = new TUserEntity
            {
                Id = user.Id,
                UserName = user.UserName,
                Password = password
            };

            userRepo.Save(newUser).Flush();

            return new IdentityResult(true);
        }, cancellationToken);

        task.Start();

        return task;
    }
userRepo 对象具有使用 HttpContext.Current 的依赖项。这两个都使用 ninject InRequestScope 解决。

上述方法在 Mvc 5 中的默认 AccountController 中调用:
var result = await IdentityManager.Users.CreateLocalUserAsync(user, model.Password);

我曾尝试将此设置添加到 web.config:
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

另外,我肯定在使用 .NET 4.5。这也在我的 web.config 中:
<httpRuntime targetFramework="4.5" />

在我开始任务之前无法从 HttpContext 获取信息,因为任务中 userRepo 的依赖项正在使用该信息,并且两个对象都使用 Ninject 解析。

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

最佳答案

这里的“任务友好同步上下文”适用于 await 的延续:无论你对 result 做什么,它都会有 http 上下文。但是,它与 task.Start 无关。这与 TaskScheduler 相关,而不是同步上下文。

基本上,通过在工作人员上执行此操作,您(在此过程中,因此)将该工作人员与 http 上下文分开。您必须:

  • 从http-context 中获取你需要的信息并将其传递给worker,或者
  • 不要使用 worker

  • 就个人而言,我怀疑您将其推给 worker 是否会获得很多 yield 。如果你真的想去 async ,理想的做法是让你的仓库在内部支持 *Async 方法。这需要的不仅仅是使用线程:它通常意味着架构更改,例如,使用异步 SQL 方法。从头开始编写的使用 async 和同步上下文感知的延续(又名 await )会自动保留诸如 http 上下文之类的内容。

    这里的重要区别是 async/await 实现是线性的但不是连续的,即
     <===(work)==>
                        <===(callback; more work)===>
                                                         <===(another callback)===>
    

    where-as 您现有的代码可能会并行执行操作,即
    <==========(original work)=================>
             <===========(task on worker thread)=============>
    
    async/await 方法基本上是线性的这一事实使它更适合访问诸如 http-context 之类的东西,因为它知道(正确完成)一次只有一个线程访问它 - 即使它不是' t 端到端的同一个线程。

    关于c# - 异步任务中的 HttpContext.Current null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19111218/

    10-16 20:04