偶尔,我们的站点速度会减慢,内存使用量也会大幅上升。然后应用程序池停止,我必须重新启动它。接下来的几天内,内存会再次猛增,应用程序池很快就会停止。CPU不高。
在应用程序池停止之前,我注意到我们的一个页面总是挂起。它挂起的线是ResourceSet的一个前瞻:
var englishLocations = Lang.Countries.ResourceManager.GetResourceSet(new CultureInfo("en-GB"),true,true);
foreach(DictionaryEntry entry2 in englishLocations) // THIS LINE HANGS我们在不同的框上部署了相同的代码,但这种情况不会发生。这两个盒子的主要区别是:
坏盒
好盒
我尝试将uploadReadAheadSize="0“添加到web.config中,如下所述:
http://rionscode.wordpress.com/2013/03/11/resolving-controller-blocking-within-net-4-5-and-asp-net-mvc/
但没起作用。
为什么会被绞死?它挂在第一个项目上,实际上是在前额上。
谢谢。
发布于 2014-12-16 11:00:07
我知道这是个老职位,但是.在迭代ResourceSet时,可能会出现死锁,同时也会从相同的参考资料中检索其他对象。
问题是,当使用ResourceSet时,迭代器取出ResourceReader http://referencesource.microsoft.com/#mscorlib/system/resources/resourcereader.cs,1389的内部资源缓存上的锁,然后在方法中AllocateStringNameForIndex取出读取器本身的锁:http://referencesource.microsoft.com/#mscorlib/system/resources/resourcereader.cs,447。
lock (_reader._resCache) {
key = _reader.AllocateStringForNameIndex(_currentName, out _dataPosition); // locks the reader获取对象以相反的顺序取出相同的锁:
http://referencesource.microsoft.com/#mscorlib/system/resources/runtimeresourceset.cs,300和http://referencesource.microsoft.com/#mscorlib/system/resources/runtimeresourceset.cs,335
lock(Reader) {
....
lock(_resCache) {
_resCache[key] = resLocation;
}
}这可能导致僵局。我们最近遇到了这个问题..。
发布于 2014-07-03 03:08:25
我也经历过类似的问题。
每隔一段时间IIS就会挂起,我会看到很多请求就在那里。它们都处于状态ExecuteRequestHandler中,并且都具有ManagedPipelineHandler模块名。
在对process进行研究之后,我可以看到他们都坐在mscorlib.dll!ResourceEnumerator.get_Entry上,额外的堆栈跟踪提示了一些NGen操作,然后是ntdll.dll!WaitForMultipleObjects。
我的工作假设是,当多个线程开始枚举这些资源时,我们可能会遇到一个死锁(可能是在一些本机代码文件生成上),然后所有后续线程都会继续堆积。
为了解决这个问题,我只是在这个代码块周围创建了一个关键部分,以确保它是按顺序执行的--从那以后我就没有经历过这个问题。
private static readonly object ResourceLock = new object();
public static MvcHtmlString SerializeGlobalResources(this HtmlHelper helper)
{
lock (ResourceLock)
{
// Existing code goes here ....
}
}发布于 2013-08-15 16:06:23
基于另一个答案,给你一些想法,如何使用一个尝试捕获模型?也许它挂起是因为该资源不可用/无法锁定,/..permissions等等。
var englishLocations = Lang.Countries.ResourceManager.GetResourceSet(new CultureInfo("en-GB"),true,true);
foreach(DictionaryEntry entry2 in englishLocations) // THIS LINE HANGS
ResourceManager CultureResourceManager = new ResourceManager("My.Language.Assembly", System.Reflection.Assembly.GetExecutingAssembly());
ResourceSet resourceSet = CultureResourceManager.GetResourceSet("sv-SE", true, true);
try { resourceSet.GetString("my_language_resource");}
catch (exception ex) { // from here log your error ex to wherever you like with some code }https://stackoverflow.com/questions/17965347
复制相似问题