我需要与其他代码并行运行大量代码,以便用户不必等待..我正在尝试Task.Run(() =>
完成我的任务。我的任务是使用依赖注入从服务调用方法。
我收到以下错误:
{"依赖项解析失败,类型 = \"Company.CacheProvider.CacheEmployeeProvider\", name = \"(none)\"。\r\n异常发生在:解析时。\r\n异常是:InvalidOperationException - The PerRequestLifetimeManager只能在 HTTP 请求的上下文中使用。此错误的可能原因是在非 ASP.NET 应用程序上使用生命周期管理器,或者在与适当的同步上下文不相关的线程中使用它。\r\ n-----------------------------------------------\r \n发生异常时,容器为:\r\n\r\n 正在解析 Company.Provider.CacheProvider.CacheEmployeeProvider,(none)\r\n 正在解析构造函数 Company.Provider.CacheProvider 的参数 \"cache\" .CacheEmployeeProvider(Company.Provider.Interface.IEmployeeProvider provider, Company.Provider.Interface.ICache 缓存)\r\n 解析 Company.Provider.CacheProvider.RequestCache,(none)(从 Company.Provider.Interface.ICache 映射,(none))\r\n"}
错误提供了可能的原因.. 但我找不到解决方案..
整个应用程序正在使用PerRequestLifetimeManager
.. 我怎样才能在可能的任务中使用它.. 或者我怎样才能让我的任务在不同的上下文中运行而没有任何问题..
更新: - 注册
var container = new UnityContainer();
container.RegisterType<IEmployeeProvider>(new InjectionFactory(unity => unity.Resolve<CacheEmployeeProvider>(new DependencyOverride(typeof(IEmployeeProvider), unity.Resolve<DbEmployeeProvider>()))));
container.RegisterType<IEmployeeService, EmployeeService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
DynamicModuleUtility.RegisterModule(typeof(Microsoft.Practices.Unity.Mvc.UnityPerRequestHttpModule));
这是基本代码 EmployeeController
依赖
[Microsoft.Practices.Unity.Dependency]
public Lazy<IEmployeeService> EmployeeService { get; set; }
发布请求
[HttpPost]
public ActionResult AddEmployee(EmployeeModel model)
{
var employee = EmployeeService.Value.Add(model);
Task.Run(() => SetupEmployeeArea(employee.Id)); //task to setup employee related data
return RedirectToAction("EmployeeList"); //redirect user to the list of employees
}
任务
async Task SetupEmployeeArea(int id)
{
EmployeeService.Value.EmployeeSetup(id); //this call firing exception
}
我也尝试过,但是这段代码没有完全执行......在调试时我丢失了中间的指针,什么也没发生。
async Task SetupEmployeeArea(int id)
{
var employeeService = DependencyResolver.Current.GetService<IEmployeeService>();
employeeService.EmployeeSetup(id); //not getting any exception and code is also not running
}
请分享建议......或者如果可能的话,也请分享最好的替代方案来满足我的要求(并行运行大量代码),除了“Hangfire”......我已经有太多的负载了:)
问题是 http 上下文在任务完成之前关闭。尝试使控制器的方法异步并运行如下任务:
await Task.Run(() => SetupEmployeeArea(employee.Id)); //task to setup employee related data
然后任务在 http 上下文关闭之前完成。
如果您想在任务完成之前返回结果,请考虑使用一些后台工作程序,例如 QueueBackgroundWorkItem https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule- and-run-background-processes-in-asp-net/或一些外部框架(如 Hangfire)并注册您的依赖项以在 http 上下文之外解析。
如果不需要在 http 上下文中解析某些服务,请将其范围更改为另一个,例如瞬态或单例https://msdn.microsoft.com/en-us/library/ff647854.aspx。您始终可以创建自定义生命周期管理器来处理 http 上下文关闭的情况,如下所示:https : //stackoverflow.com/a/4698138/9502162。
另一种方法是加载页面,然后使用 ajax 调用执行此任务,以便用户立即看到该页面。但是通过这种方法,您可以让客户端应用程序负责设置可能不需要的员工相关数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句