c# – HttpContext.Current null异步任务

我有一个使用存储库(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;
    }

userRepoobject具有使用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不会为空?

解决方法

这里的“任务友好同步上下文”适用于等待的延续:无论您如何使用结果,都将具有http上下文.然而,它并不涉及到task.Start.这与 TaskScheduler相关,而不是同步上下文.

基本上,通过对工作者执行此操作,您(在此过程中,因此)将该工作人员从http上下文中离职.你必须:

>从http-context获取您需要的信息,并将其传递给工作者,或
>不要使用工人

就个人而言,我怀疑你是通过把这个推向一个工人而获得的.如果你真的想要异步,那么理想的做法是让你的内部支持* Async方法.这不仅仅需要使用线程:它通常意味着架构更改,例如使用异步sql方法.从头开始使用异步和同步上下文感知延续(aka等待)将自动保存像http上下文的东西.

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

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

在那里 – 您现有的代码可能并行执行某些操作,即

<==========(original work)=================>
         <===========(task on worker thread)=============>

异步/等待方法基本上是线性的事实使得它更适合于访问诸如http-context之类的东西,因为它知道(完成的)在一次只访问一个线程 – 即使它不是’端到端相同的线程.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...