如何在ASP.net MVC中正确执行异步方法?
发布时间:2020-12-16 07:45:33 所属栏目:asp.Net 来源:网络整理
导读:如何在控制器方法中执行异步方法并返回HttpStatusCodeResult(200),而async委托不会过早地终止其执行? 我正在开发一个asp.net应用程序,我的一个动作是我的家庭控制器需要很长时间才能运行(10-30秒).我想返回一个HttpStatusCodeResult(200)并继续运行我的函数
如何在控制器方法中执行异步方法并返回HttpStatusCodeResult(200),而async委托不会过早地终止其执行?
我正在开发一个asp.net应用程序,我的一个动作是我的家庭控制器需要很长时间才能运行(10-30秒).我想返回一个HttpStatusCodeResult(200)并继续运行我的函数. functoin不需要返回任何东西,但它仍然不是真正的火灾和遗忘,因为我立即用HttpStatusCodeResult返回对服务器的响应. 我尝试使用委托,但似乎一旦我从动作返回状态代码,委托就会停止执行.另一个选择是创建一个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 Core 2.0 in Docker on Wind
- ASP.NET WebApi:(405)方法不允许
- .net – HttpContext.Request和Request之间的区别
- asp.net – 在ObjectDataSource更新事件期间取消Gridview编
- asp.net-mvc – 使用LINQ进行动态查询将无法正常工作
- ASP.Net/C#,循环浏览页面上的某些控件?
- asp.net-mvc – 如何在共享托管环境中实现ASP.Net MVC网站的
- asp.net-web-api – 用于IONIC2应用程序和Identity Server4
- asp.net – 使用Elmah捕获背景线程中的异常
- asp.net-mvc – 自定义授权MVC 3和Ninject IoC
推荐文章
站长推荐
热点阅读