gpt4 book ai didi

asp.net - 更改文件夹后延迟AppDomain回收

转载 作者:行者123 更新时间:2023-12-04 13:19:42 24 4
gpt4 key购买 nike

我正在开发ASP.NET 4应用程序,并在开发过程中也使用完整的IIS(出于多种原因;我使用多个指向该应用程序的域)。

当我在Visual Studio中构建项目时,IIS确实回收了AppDomain并加载了新构建的项目,但是现在我遇到了问题,它会“快速”完成该工作。
我的页面上有一些脚本,这些脚本会在应用程序回收后立即触发(例如不断打开SignalR channel ),因此当仅构建我的项目的一半时就已经创建了一个新的AppDomain,因此它第二次回收了,然后实际上崩溃了,因为我有一个PreApplicationStartMethod将一些Plugin-DLL复制到Shadow-Copy目录,但是“旧DLL”仍然被第一个AppDomain锁定。
如果我再等10秒钟,一切都会好起来,我的“新AppDomain”将启动。
我只是通过简单地告诉IIS等待几秒钟来解决此问题,以便在检测到bin文件夹中的更改后,构建可以完成。

所以对于我的主要问题:
是否可以延迟IIS下的AppDomain回收?

最佳答案

如果您不能延迟AppDomain的回收,则可能要禁用它。

可以禁用文件更改通知(FCN)行为。

注册表

最初,它是HKLM\Software\Microsoft\ASP.NET\FCNModesetting the value to 1 should disable it上的DWORD注册表项。

代码(hack)到.NET Framework 4.0为止

这个 hack 可能适用于2.0-3.5和4.0框架。

//Disable AppDomain restart on file change

System.Reflection.PropertyInfo p =
typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor",
System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Public
| System.Reflection.BindingFlags.Static);

object fcm = p.GetValue(null, null);

System.Reflection.MethodInfo m = fcm.GetType().GetMethod("Stop",
System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.NonPublic);
m.Invoke(fcm, new object[] { });

将其放在 Global.asax Application_Start中。参见 here

如果要禁用对特定路径或文件的监视,可以使用 StopMonitoringFile 中的 StopMonitoringPathFileChangesMonitor方法。但是, Bin目录是一个特殊的目录,可能不受这两种方法的影响。

至少,您可以使用 _dirMonSpecialDirs字段,并在 StopMonitoring()目录中调用 Bin

.NET Framework 4.5

在.NET Framework 4.5中,存在 HttpRuntimeSection.FcnMode属性。关于它的文档并不多,但是您可以使用 <httpRuntime fcnMode="Disabled"/>

关于asp.net - 更改文件夹后延迟AppDomain回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18063640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com