我在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 Service等)上执行此查询,但是问题是我不知道为什么会发生...。
如果将来我不得不在Application_Start中放入一些耗时的代码会怎样?
最佳答案
这种方法存在几个问题。
首先-加载那么多数据并将其粘贴在应用程序中似乎是多余的。我可以在那么长的时间内查询数百万条记录,因此我将检查您的索引和查询以确保这确实是必要的。您要装入什么样的数据才能进入应用程序?
还要记住,您将增加应用程序的工作内存,这有时会导致其根据IIS工作进程设置被重置。
Application_Start应该尽快完成,以便运行时知道一切正常。我相信您的僵局不是典型情况下的僵局,而是“我认为它陷入困境”的情况。
如前所述-一种选择是将您的处理拉到另一个线程中。但是请注意,当您的应用程序空闲一段时间后,它将被关闭。您可以在IIS中更改这些设置,但我真的会考虑重新考虑这种数据加载。为什么不按需从数据库查询?您可以在数据库侧使用此数据创建一个新的索引 View (以及其他建议)
关于.net - global.asax上慢的Application_Start造成死锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6839384/