Dictionary.clear()在执行时挂起

时间:2012-08-28 06:54:16

标签: .net multithreading dictionary web-config filesystemwatcher

我有一个 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()]);
  }
}

_ dictMonitor Object ,用于锁定; ConfigurationParameter 是枚举,用于定义键名。当 FileSystemWatcher 更改事件发生时,将调用此方法。 问题是程序执行在_ dictionary.Clear(); lock(dictMonitor); 上暂停,没有任何延迟。在调试时,手动调用我的方法 ReadCurrentConfiguration 执行正常 - 它会正常清理字典并填充新值。但如果事件发生,它就会停止。此外,如果执行传递给 clear()方法,则调试器显示以下消息而不是_ 字典值:_ 字典Count =无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。有人能说明为什么会出现此问题吗?

2 个答案:

答案 0 :(得分:0)

循环中的某些东西可能导致事件再次发生,导致无限循环。

尝试这样的事情:

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

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

答案 1 :(得分:0)

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