-1

FileSystemWatcherクラスを使用してディレクトリの変更を監視しているプログラムがあります。他のクライアントが。を使用してこのディレクトリに書き込んでいますStreamWriter。「時々」、filesystemwatcherが作成したイベントで、ファイルにアクセスしようとすると、エラーが発生します。

これは頻繁には発生しないため、デバッグは非常に困難です。Usingクライアントは、ストリームをブロックで囲むことにより、ストリームを適切に閉じています。エラーは「このアプリケーションは別のプロセスで使用されているため、ファイルを使用できません」の行にあります。クライアントが同じコードを使用してファイルをディレクトリに書き込んでいるときに、エラーが散発的にしか表示されないのはなぜですか。ほとんどの場合、手動コピーでエラーが発生することがあります。

問題のディレクトリはネットワークディレクトリではなく、そのローカルです。提案してください。

クライアントコード

using (StreamWriter ss = new StreamWriter(input)) {
    ss.WriteLine(args(0));
    ss.Close();
}

アプリケーションイベントコードの監視

public void Temp()
{
FileSystemWatcher fs = new FileSystemWatcher();

fs.Path = GlobalStatics.PathWorkOrders;
fs.IncludeSubdirectories = false;
fs.Filter = "*.wo";
fs.EnableRaisingEvents = true;

fs.Created += CreatedEvent;
}

public void CreatedEvent(object sender, System.IO.FileSystemEventArgs e)
    {
        string guidStr = Path.GetFileNameWithoutExtension(e.FullPath);

        using (StreamReader sr = new StreamReader(e.FullPath))
        {
            //Processing
            sr.Close();
        }
    }
4

1 に答える 1

3

コードがないと難しいですが、競合状態が発生していると思います。これは、ほとんどの場合に起こっていると私が信じていることです。

  • プロセス A は StreamWriter を使用してファイルを更新し、ファイルをロックしています。
  • プロセス A は更新を完了し、ファイルを閉じます。
  • FileSystemWatcher が起動し、ファイルを処理します。

    制御できないタイミングの問題により、順序が少し異なる場合があります。

  • プロセス A は StreamWriter を使用してファイルを更新し、ファイルをロックしています。

  • FileSystemWatcher が起動し、ファイルを処理します。
  • プロセス A は更新を完了し、ファイルを閉じます。

    ファイルがロックされているため、ウォッチャーはファイルを処理できません。

    その例外が発生した場合は、しばらくしてから再試行する必要があります。

編集:コードを見た後、私の答えはまだ理にかなっています。

于 2012-09-14T21:50:26.320 に答える