首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >foreach神秘地挂在ResourceSet的第一项上

foreach神秘地挂在ResourceSet的第一项上
EN

Stack Overflow用户
提问于 2013-07-31 08:31:44
回答 3查看 1.2K关注 0票数 15

偶尔,我们的站点速度会减慢,内存使用量也会大幅上升。然后应用程序池停止,我必须重新启动它。接下来的几天内,内存会再次猛增,应用程序池很快就会停止。CPU不高。

在应用程序池停止之前,我注意到我们的一个页面总是挂起。它挂起的线是ResourceSet的一个前瞻:

代码语言:javascript
复制
var englishLocations = Lang.Countries.ResourceManager.GetResourceSet(new CultureInfo("en-GB"),true,true);
foreach(DictionaryEntry entry2 in englishLocations) // THIS LINE HANGS

我们在不同的框上部署了相同的代码,但这种情况不会发生。这两个盒子的主要区别是:

坏盒

  • Window 2008 R2标准SP 1
  • IIS 7.5.7600.16385
  • .NET 4.5
  • 24 RAM

好盒

  • 2008服务器SP2
  • IIS 7.0.6000.16386 SP 2
  • .NET 4.0
  • 24 RAM

我尝试将uploadReadAheadSize="0“添加到web.config中,如下所述:

http://rionscode.wordpress.com/2013/03/11/resolving-controller-blocking-within-net-4-5-and-asp-net-mvc/

但没起作用。

为什么会被绞死?它挂在第一个项目上,实际上是在前额上。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 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

代码语言:javascript
复制
lock (_reader._resCache) {
     key = _reader.AllocateStringForNameIndex(_currentName, out _dataPosition); // locks the reader

获取对象以相反的顺序取出相同的锁:

http://referencesource.microsoft.com/#mscorlib/system/resources/runtimeresourceset.cs,300http://referencesource.microsoft.com/#mscorlib/system/resources/runtimeresourceset.cs,335

代码语言:javascript
复制
lock(Reader) {
    ....
    lock(_resCache) {
       _resCache[key] = resLocation;
    }
}

这可能导致僵局。我们最近遇到了这个问题..。

票数 9
EN

Stack Overflow用户

发布于 2014-07-03 03:08:25

我也经历过类似的问题。

每隔一段时间IIS就会挂起,我会看到很多请求就在那里。它们都处于状态ExecuteRequestHandler中,并且都具有ManagedPipelineHandler模块名。

在对process进行研究之后,我可以看到他们都坐在mscorlib.dll!ResourceEnumerator.get_Entry上,额外的堆栈跟踪提示了一些NGen操作,然后是ntdll.dll!WaitForMultipleObjects

我的工作假设是,当多个线程开始枚举这些资源时,我们可能会遇到一个死锁(可能是在一些本机代码文件生成上),然后所有后续线程都会继续堆积。

为了解决这个问题,我只是在这个代码块周围创建了一个关键部分,以确保它是按顺序执行的--从那以后我就没有经历过这个问题。

代码语言:javascript
复制
private static readonly object ResourceLock = new object();

public static MvcHtmlString SerializeGlobalResources(this HtmlHelper helper)
{
    lock (ResourceLock)
    {
        // Existing code goes here ....
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-08-15 16:06:23

基于另一个答案,给你一些想法,如何使用一个尝试捕获模型?也许它挂起是因为该资源不可用/无法锁定,/..permissions等等。

代码语言:javascript
复制
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 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17965347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档