Global.asax上的慢Application_Start会导致死锁

时间:2011-07-27 04:20:24

标签: .net asp.net iis windbg deadlock

我在global.asax上的Application_Start代码需要2-3分钟才能完成(长数据库查询等)

每当我发布新版本的网站时,我都会在aspnet_isapi.dll上遇到死锁,并且应用程序无法启动。

它启动的唯一方法是当我禁止从Internet访问IIS时,再次重启应用程序&对网站进行一次调用(以使global.asax运行)。

我不明白为什么在应用程序启动时收到大量页面/文件请求时会发生死锁。我知道global.asax上的Application_Start只触发一次,我猜所有其他客户端只等到事件完成,所以我没有看到它有死锁的原因。

有什么想法吗?

更新

需要4-5分钟...... 代码生成db查询并将它们附加到Application变量(供以后使用)。 它是我的专用服务器上的虚拟服务器。只有一台其他机器上没有占用太多资源。 我得到事件ID 2262 - ISAPI'... \ aspnet_isapi.dll'报告自己不健康,原因如下:'检测到死锁'。

有一个SQL查询占用大部分时间。我可以在不同的进程(Windows服务/等)上执行此查询,但问题是我不明白它为什么会发生.... 如果将来我将不得不在Application_Start中放置一些耗时的代码?

会发生什么

1 个答案:

答案 0 :(得分:3)

这种方法存在一些问题。

首先 - 加载那么多数据并将其粘贴在应用程序中似乎过多了。我可以在那么多时间查询数百万条记录,因此我会检查您的索引和查询以确保这确实是必要的。你要加载什么类型的数据才能进入应用程序? 还要记住,您将增加应用程序的工作内存,这可能会导致它根据IIS工作进程设置重置。

Application_Start应尽快完成,以便运行时知道加载好的所有内容。我相信你的僵局并不像典型情况那样陷入僵局,而是像“我认为它陷入困境”的情况一样。

如上所述 - 一种选择是将您的处理引入另一个线程。但请注意,当您的应用程序闲置一段时间后,它将被关闭。您可以在IIS中更改这些设置,但我真的会考虑重新考虑这种数据加载。为什么不按需查询数据库?您可以在数据库端创建一个新的索引视图(包括其他建议)