.net Dictionary.clear()在执行时挂起

.net Dictionary.clear()在执行时挂起,.net,multithreading,dictionary,web-config,filesystemwatcher,.net,Multithreading,Dictionary,Web Config,Filesystemwatcher,我有一个web.config文件,我想对其进行解析,以防其“更改”。为此,我使用FileSystemWatcher和IDictionary集合。以下是我的方法代码: public void ReadCurrentConfiguration() { var settings = System.Configuration.ConfigurationManager.AppSettings; lock (_dictMonitor) { if (_dictionary.Count !=

我有一个web.config文件,我想对其进行解析,以防其“更改”。为此,我使用FileSystemWatcher和IDictionary集合。以下是我的方法代码:

public void ReadCurrentConfiguration()
{
  var settings = System.Configuration.ConfigurationManager.AppSettings;
  lock (_dictMonitor)
  {
    if (_dictionary.Count != 0)
      _dictionary.Clear();

    foreach (var elem in Enum.GetValues(typeof(ConfigurationParameter)).Cast<ConfigurationParameter>())
      _dictionary.Add(elem.ToString(), settings[elem.ToString()]);
  }
}
public void ReadCurrentConfiguration()
{
var设置=System.Configuration.ConfigurationManager.AppSettings;
锁定(监视器)
{
如果(_dictionary.Count!=0)
_dictionary.Clear();
foreach(Enum.GetValues(typeof(ConfigurationParameter)).Cast()中的var elem)
_添加(elem.ToString(),设置[elem.ToString()]);
}
}
_dictMonitor是用于锁定的对象;ConfigurationParameter是枚举,用于定义键名称。在引发FileSystemWatcher更改事件时调用此方法。
问题是程序执行在_dictionary.Clear()上停止;或在锁上(显示器);没有例外。调试时,手动调用我的方法ReadCurrentConfiguration执行得很好-它会正常清理字典并填充新值。但一旦发生事件,它就会停止。此外,如果将执行传递给clear()方法,则调试器将显示以下消息,而不是_dictionaryvalue:_dictionarycount=无法计算表达式,因为代码已优化或调用堆栈顶部有本机帧。有人能提出为什么会出现这个问题吗

可能是循环中的某些内容导致事件再次发生,从而导致无限循环

试着这样做:

private bool _isExecuting = false;
public void ReadCurrentConfiguration()
{
    if (_isExecuting)
        return;

    _isExecuting = true;
    var settings = System.Configuration.ConfigurationManager.AppSettings;
    //......
    _isExecuting = false;
}

一段时间后,我明白了问题的原因——更改
web.config
会使IIS重新启动应用程序,因此上面的实现是荒谬的。这很可能是“挂起”线程的原因。

是否只有这一个线程挂起,或者您的应用程序中是否有其他线程同时挂起?在该线程挂起后,我手动调用我的方法(这意味着不是在事件之后)-它正常执行。此调用正在新线程中执行,因此主程序没有挂起。顺便说一句,线程挂起后,新事件不会出现,直到我再次手动调用我的方法。不锁定(对象)执行此检查吗?嗯。。什么是字典?它到底包含了什么?
\u字典
私人IDictionary\u字典它包含web.config文件中的键值对。通过使用
ToString()
Enum.GetValues(…)
result的每个成员接收每个键(请参阅第一篇文章)。每个值都是字符串,通过web.config文件(也在第一篇文章中)中的
System.Configuration.ConfigurationManager.AppSettings[key]
接收。抱歉,没有任何线索。尝试写入循环内的文本文件(我所知道的最佳调试技术:),查看它执行了多少次,以及是否存在无限循环问题。我在调试器中看到了结果,没有无限循环,它只是堆叠,没有进一步的事件引发)可能映射了使用
AppSettings
获取的值,所以当文件被更改时,字典甚至不能访问它的成员?我不知道。不过,感谢您的贡献!