【问题标题】:How do I properly execute an Async Method in ASP.net MVC?如何在 ASP.net MVC 中正确执行异步方法?
【发布时间】:2012-07-14 17:26:11
【问题描述】:

如何在控制器方法中执行异步方法并返回 HttpStatusCodeResult(200),而异步委托不会过早终止其执行?

我正在开发一个 asp.net 应用程序,我的家庭控制器需要很长时间才能运行(10-30 秒)。我想返回一个 HttpStatusCodeResult(200) 并继续运行我的函数。 functoin 不需要返回任何东西,但它仍然不是真正的火灾和忘记的情况,因为我立即使用 HttpStatusCodeResult 向服务器返回响应。

我尝试使用委托,但似乎一旦我从操作返回状态代码,委托就会停止执行。另一种选择是创建 Windows 服务,但这就像使用火箭筒杀死苍蝇一样。我收到的请求很少,所以资源和性能对我来说不是问题。我听说ThreadPool.QueueUserWorkItem 是一个选项,但哪个最适合我的情况?

【问题讨论】:

  • 这可能是你最好的选择:Using an Asynchronous Controller in ASP.NET MVC
  • 但我认为它只会优化线程池的使用,我的意思是我无法返回 httpstatus 代码并继续执行,请检查 Converting Synchronous Action Methods to Asynchronous Action Methods 部分

标签: asp.net asp.net-mvc threadpool


【解决方案1】:

创建一个静态类来管理这个长时间运行的操作。此类将负责创建线程来执行任务,并提供一种检查任何正在进行的操作状态的方法(即它是否仍在进行中或已完成,如果是,结果是什么)。

然后,您的 MVC 控制器方法使用此类来完成工作并将状态信息或已完成的处理数据呈现给用户。

类似这样的:

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 标记为已完成。

【讨论】:

  • 这听起来好像可行。我唯一不能弄清楚的部分是:一旦控制器方法完成执行,谁还在监听异步结果?
  • 没有人。不需要有听众。只需将已完成操作的结果存储在内存中,直到客户端请求它。有关示例,请参阅我的更新答案。在这种情况下,我使用字典(请注意,我的代码不是线程安全的,并且充满了错误,但您应该能够大致了解)。
猜你喜欢
  • 2014-07-07
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2019-02-24
相关资源
最近更新 更多