【问题标题】:Asp.net mvc processing a task asynchronouslyAsp.net mvc 异步处理任务
【发布时间】:2012-12-25 08:15:59
【问题描述】:

我正在开发具有以下要求之一的 asp.net mvc 应用程序。

场景:用户提交请求以处理长时间运行的任务。该任务必须在服务器端启动。并且无需等待任务完成,就必须向用户发送响应,说一旦任务完成,他们将收到电子邮件通知。

这似乎是异步处理的场景。最初我想使用异步委托,但后来知道异步委托将作为后台线程运行,并且如果主线程退出将不会保持活动状态。对我来说,似乎一旦将响应发送给用户,主线程就会退出等等作为后台线程。如果我错了,请纠正我。

所以我想到了使用 Thread 类创建一个前台线程。但是在我读过的一篇文章中,提到asp.net不会查看它是否是前台线程并且不会有用。是真的吗?

我目前正在查看以下替代方案。请推荐

  1. 将任务处理逻辑移出 asp.net 并放入控制台应用程序/服务 并通过将消息从 asp.net 推送到 MSMQ 来通知应用程序。收到消息后,控制台应用程序将进行处理并发送电子邮件通知

  2. 接收消息并进行处理的 WCF 服务

还有其他更好的想法欢迎分享

谢谢,

盗贼

【问题讨论】:

  • 我不知道,但这两种解决方案中的任何一种对我来说都很好。

标签: asp.net-mvc asynchronous


【解决方案1】:

你可以简单地使用:

ThreadPool.QueueUserWorkItem(o =>
                                    {
                                        // do something aync
                                    });

Previous comments on this:

关于饿死线程请求池的争论有很多 这样做(这是真的),但相反的论点是你应该 因为服务器正忙于工作,所以使池饥饿。当然 理想情况下,您应该完全通过 排队/分布式系统等,但这是一个复杂的解决方案。除非 你需要处理数百个你不需要考虑的请求 这个选项,因为它不太可能导致问题。它真的 取决于您的解决方案的可扩展性要求,多长时间 后台进程将占用,以及调用频率。

【讨论】:

  • 我认为 ThreadPool.QueueuserWorkItem 创建了一个后台线程,由于一旦主线程完成后后台线程就不再存在,在上述情况下不会产生问题吗?
  • 不,绝对不会,它会从线程池中创建一个新线程,请求线程可以终止。
  • 感谢您的回复。但是当线程池线程在后台时,我们怎么能说线程根本不会被终止
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多