我正在尝试通过Async控制器执行导入过程,其中我声明了一个Task,以便所有方法都可以访问它,但是当Task进程完成时它变为null并且我无法从另一个看到它的信息方法。
[SessionState(SessionStateBehavior.Disabled)]
public class ImportController : AsyncController
{
private Task<ResultObject> _myTask;
public ActionResult Import()
{
_myTask = Task.Run(() => {
//failed or Success
return new ResultObject();
});
_myTask.Wait();
return Json(new { success : _myTask.Result });
}
public ActionResult CheckImportProcess()
{
//here _myTask is Null
if(_myTask.Status == TaskStatus.Running){
return Content("IS RUNNIN");
}
else{
return Content(_myTask.Result);
}
}
}
我该怎么做?
更新 我尝试使用Hangfire来做到这一点,但这是不可能的。我的导入方法应该返回错误列表,而使用Hangfire则无法访问运行的返回。
答案 0 :(得分:0)
每次发出请求时都会创建一个ImportController
的新实例,因此非静态_myTask
字段将在每个其他请求上初始化为空值。
你可以通过使_myTask
静态,或者通过注入某种单例范围的管理器类来跟踪你在控制器范围之外的任务来解决这个问题。
private static Task<ResultObject> _myTask;
然而,在目前的状态下,这将是非常脆弱的。如果两个不同的用户启动此任务会发生什么?它应该运行两次吗?您是否应该忘记第一次运行,因为第二次运行已开始?你接近这个问题的方式似乎很容易引起问题,我同意Panagiotis你可能应该使用不同的框架来解雇和跟踪任务的状态。