gpt4 book ai didi

asp.net - 如何在 ASP.net MVC 中正确执行异步方法?

转载 作者:行者123 更新时间:2023-12-04 21:47:47 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

然后,您的 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 标记为已完成。

关于asp.net - 如何在 ASP.net MVC 中正确执行异步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11494581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com