0

web.configファイルがあり、変更された場合に解析したいと思います。この目的のために、FileSystemWatcherIDictionaryコレクションを使用します。これが私のメソッドのコードです:

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オブジェクトであり、ロックに使用されます。ConfigurationParameterは列挙型であり、キー名を定義するために使用されます。このメソッドは、FileSystemWatcherの変更イベントが発生しているときに呼び出されます。問題は、プログラムの実行が_dictionary.Clear ();のいずれかで停止することです。またはlock(dictMonitor); 例外なし。デバッグ時に、メソッドReadCurrentConfigurationを手動で呼び出すと、正常に実行されます。これにより、ディクショナリが正常にクリーンアップされ、新しい値が入力されます。ただし、イベント発生の場合は停止します。また、実行がclear()メソッドに渡されると、デバッガーは_ディクショナリ値の代わりに次のメッセージを表示します。辞書カウント=コードが最適化されているか、ネイティブフレームが呼び出しスタックの最上位にあるため、式を評価できません。この問題が発生する理由を誰かが提案できますか?

4

2 に答える 2

0

ループ内の何かが原因でイベントが再び発生し、無限ループが発生する可能性があります。

次のようなものを試してください。

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

    _isExecuting = true;
    var settings = System.Configuration.ConfigurationManager.AppSettings;
    //......
    _isExecuting = false;
}
于 2012-08-28T07:05:22.100 に答える
0

しばらくして、問題の原因を理解しましたweb.config。IISがアプリケーションを再起動するように変更したため、上記の実装はばかげています。これが、スレッドを「ハング」させる理由である可能性があります。

于 2014-06-15T16:50:25.153 に答える