【发布时间】:2017-05-01 01:44:42
【问题描述】:
我正在尝试通过异步控制器执行导入过程,在该控制器中我声明了一个任务,以便所有方法都可以访问它,但是当任务过程完成时,它变得空,我无法从另一个控制器中看到信息方法。
[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 则无法访问运行的返回。
【问题讨论】:
-
为什么方法应该访问 task 而不是结果?并不是说他们可以。每个请求都会产生一个不同的控制器实例。如果你想创建一个长期运行的作业,那不是这样做的。
-
查看 Scott Hanselman 的 How to run Background Tasks in ASP.NET。它解释了为什么您的要求不起作用,如何使用 QueueBackgroundWorkItem 正确启动后台任务以及如何实现计划作业,例如使用 Hangfire
标签: c# asp.net-mvc asynchronous task