如何在控制器方法中执行异步方法并返回HttpStatusCodeResult(200),而async委托不会过早地终止其执行?
我正在开发一个asp.net应用程序,我的一个动作是我的家庭控制器需要很长时间才能运行(10-30秒)。我想返回一个HttpStatusCodeResult(200)并继续运行我的函数。 functoin不需要返回任何内容,但它仍然不是真正的火灾和遗忘,因为我立即使用HttpStatusCodeResult
向服务器返回响应。
我尝试使用委托,但似乎一旦我从动作返回状态代码,委托就会停止执行。另一个选择是创建一个Windows服务,但这就像使用火箭筒杀死一只苍蝇。我得到的请求很少,所以资源和性能在我的情况下不是问题。我听说ThreadPool.QueueUserWorkItem
是一个选项,但哪个最适合我的情况?
答案 0 :(得分:1)
创建一个静态类来管理这个长时间运行的操作。该类将负责创建执行任务的线程,并提供一种方法来检查任何正在进行的操作的状态(即,它是否仍在进行中或已完成,如果是,结果是什么)。
然后,您的MVC Controller方法使用此类来完成工作,并向用户显示状态信息或已完成的已处理数据。
这样的事情:
public ActionResult GetSomething(String id) {
TaskResult result = TaskClass.GetStatus( id );
if( result == null ) { // the task has not been run, so start it up
TaskClass.StartNew( id );
return new View("PleaseWait");
} else if( !result.IsFinished ) {
return new View("PleaseWait");
} else {
return View("Results", result);
}
}
public static class TaskClass {
private static Dictionary<String,TaskResult> _tasks;
public static TaskResult GetStatus(String id) {
// TODO: Make this code thread-safe
if( _tasks.ContainsKey(id) ) return _tasks[id];
return null;
}
public static void Start(String id) {
_tasks.Add( id, new TaskResult("Working") );
Thread thread = new Thread( SomeExpensiveOperation );
thread.Start( id );
}
}
在SomeExpensiveOperation结束时,会有代码将TaskResult标记为已完成。