【问题标题】:Dictionary.clear() hangs on executionDictionary.clear() 挂起执行
【发布时间】:2012-08-22 15:52:36
【问题描述】:

我有一个 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() 方法,调试器将显示以下消息而不是 _dictionary 值:_dictionary Count = Unable to evaluate expression because the代码已优化或本机框架位于调用堆栈之上。 谁能指出为什么会出现此问题?

【问题讨论】:

  • 是只有这一个线程挂起,还是您的应用中是否有其他线程同时挂起?
  • 这个线程挂起后,我手动调用我的方法(这意味着不是在事件之后) - 它正常执行。这个调用在新线程中执行,所以主程序没有挂起。
  • 顺便说一句,线程挂起后,新事件不会引发,直到我再次手动调用我的方法。

标签: .net multithreading dictionary web-config filesystemwatcher


【解决方案1】:

也许你的循环中的某些东西会导致事件再次发生,从而导致无限循环。

试试这样的:

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

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

【讨论】:

  • lock(object) 不执行此检查吗?
  • 嗯.. _dictionary 是什么?究竟包含什么?
  • _dictionary 是 private IDictionary&lt;String, String&gt; _dictionary; 它包含来自 web.config 文件的键值对。每个密钥都是通过使用ToString() 接收到Enum.GetValues(...) 结果的每个成员(见第一篇文章)。每个值都是字符串,通过 System.Configuration.ConfigurationManager.AppSettings[key] 从 web.config 文件接收(也在第一篇文章中)。
  • 抱歉没有任何线索。尝试在循环内写入文本文件(我知道的最好的调试技术:)),看看它执行了多少次,如果你有无限循环问题。
  • 我在调试器中看到了结果,没有无限循环,它只是堆叠而没有进一步的事件引发)可能使用 AppSettings 获取的值被映射,所以字典甚至无法访问它' 文件更改时的成员?我不知道。不过,感谢您的贡献!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 2018-07-05
    • 2015-01-17
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    相关资源
    最近更新 更多