【问题标题】:Application Dispose call prevent应用程序 Dispose 调用阻止
【发布时间】:2014-09-03 10:14:33
【问题描述】:

我有托管在 Azure 云服务上的 ASP.NET MVC 应用程序。

我正在使用带有命令处理程序的 CQRS 架构。

而且这个系统总是有正在运行的线程,这些线程一直在后台工作。应用程序的主要目标是为医疗中心患者发送短信。系统按以下步骤工作:

  1. 系统启动命令(例如 StartMessageSending) 选择一些患者
  2. 它会向他们发送 SMS 通知
  3. 并在确定的时间间隔内进入睡眠状态。

在间隔超时后,此线程重复所有先前的步骤,直到存在任何要发送的患者。

与此并行,系统可以使用相同的命令(StartMessageSending)运行任意数量的其他线程。平均而言,系统大约有 3 个使用 StartMessageSending 命令同时运行的线程。

如果我查看应用程序日志,我会看到频繁调用 Application Dispose。 而这些 dispose 会导致系统出现奇怪的行为:命令没有完成它们的工作。

我举2个日志例子:

1) 正确指挥工作

2) 不正确指挥工作

之后,应用程序多次调用 dispose。 并且间隔配置等于 30 秒。

在这些 App Disposes 当前工作的命令之后不要完成它的工作。

我想指出,我在 IIS 上禁用了 idleTimeout(20 分钟未使用)超时,并设置为特定的夜间时间周期重新启动 IIS 回收。

而且应用程序非常庞大,这个问题在不同命令的工作中经常发生。我举了一个问题的一般描述的例子。

也许有人知道:

1) 我怎样才能防止这些应用程序处置?

2) 或者他们打电话的可能原因是什么? (一般)

谢谢:)

【问题讨论】:

  • 虽然这些截图很可爱,但我们需要看看你的代码
  • @YuvalItzchakov,应用程序非常庞大,这个问题经常发生在不同命令的工作中。我举了一个问题的一般描述的例子。
  • 一般描述是不够的。我们只能假设做错了什么,不能给我一个一般性的答案。请尝试对您的问题进行简单、小而完整的重现。

标签: c# .net asp.net-mvc multithreading azure


【解决方案1】:

理想的解决方法是将消息发送逻辑移至辅助角色,并使用队列将命令发送给辅助角色。

但作为一种快速修复,您可以不断地从应用程序自身“Ping”您的应用程序,这样它就不会被关闭(不是那么频繁),本文介绍了如何做到这一点。

http://weblog.west-wind.com/posts/2007/May/10/Forcing-an-ASPNET-Application-to-stay-alive

【讨论】:

    猜你喜欢
    • 2015-04-21
    • 1970-01-01
    • 2012-07-12
    • 2020-12-13
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多