0

ファイルシステムウォッチャーを使用して、ファイルが変更されたときに変更された情報をフォームに表示したいのですが、onchaged イベントが発生しますが、1 回ではなく 2 回発生し、表示したいフォームが表示されず、プログラムが表示されずに停止します。デバッグを停止するだけの例外

public void Run()
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = pathOfPatientFixedFile.Remove(pathOfPatientFixedFile.IndexOf("PatientFixedData.xml")-1);
    watcher.Filter = "PatientFixedData.xml";
    watcher.Changed += new FileSystemEventHandler(watcher_Changed);
    watcher.EnableRaisingEvents = true;
}

private void watcher_Changed(object sender, FileSystemEventArgs e)
{
    try
    {
        GetPatientInfo(e.FullPath);
        frmPatientInfoDisplay displayPatientInfo = new frmPatientInfoDisplay(_patientInfo);
        displayPatientInfo.Show();
    }
    catch (Exception ex)
    {
    }
}

GetPatientInfo のコード

private void GetPatientInfo(String filePath)
{
    try
    {
        XmlDocument xmlDoc = new XmlDocument();
        using (StreamReader sr = new StreamReader(filePath, Encoding.Default))
        {
            String line = sr.ReadToEnd();
            if (line.IndexOf("<IsPatientFixed>") > 0)
            {
                var value = GetTagValue(line, "<IsPatientFixed>", "</IsPatientFixed>");
                if (value == "true" || value == "True")
                {
                    if (line.IndexOf("<PatientID>") > 0)
                        _patientInfo[0] = GetTagValue(line, "<PatientID>", "</PatientID>");
                    if (line.IndexOf("<PatientName>") > 0)
                        _patientInfo[1] = GetTagValue(line, "<PatientName>", "</PatientName>");
                    if (line.IndexOf("<PatientSex>") > 0)
                        _patientInfo[2] = GetTagValue(line, "<PatientSex>", "</PatientSex>");
                    if (line.IndexOf("<PatientDateOfBirth>") > 0)
                        _patientInfo[3] = GetTagValue(line, "<PatientDateOfBirth>", "<PatientDateOfBirth>");
                }
            }
        }
    }
    catch (Exception ex)
    {
    }
}
4

1 に答える 1

3

まず第一に、これは使い捨てコンポーネントであるため、誤用しています。FileSystemWatcherローカル変数ではなくフィールドに格納し、不要になったときに破棄する必要があります。

長期間有効な参照を保存していないため、ガベージ コレクションが行われている可能性があり、それがデバッグの停止につながる可能性があります。

また、ファイルと対話している他のプログラムによってファイルに対して実行されている操作に応じて、複数回起動する可能性があります。また、通知を受け取った時点でプログラムがファイルにアクセスできるという保証はありません。

コメントで回避されているように、a) TODO を実装するか、b) これらの空のcatchブロックを削除する必要があります (より良いオプション、IMO)。「例外はスローされません」と言っていますが、現時点ではそれを検出するのがかなり難しくなっています。素敵な醜いエラーでプログラムをクラッシュさせる方がはるかに良いでしょう。

于 2012-08-24T07:05:28.460 に答える