1

現在、ネットワーク パスを監視する FileSystemWatcher を含むプログラムを作成しています。

ファイルはすべて .txt です。ほとんどのファイルは 200k から 3 MB の間です。ファイルがコピーされるのではなく、監視フォルダーに直接保存されるとエラーが発生するため、この回答に基づいてタイマーを構築しています。

FileSystemWatcher は、ファイルが保存される前に起動します - どのようにプロセスを「一時停止」しますか?

ここで質問があります。これらのイベントを非常に高速に処理する必要があるため、ユーザーが言及した 1000 ミリ秒を実際に使用する必要がありますか、それともより低い値で問題ありませんか? より具体的には、一方では速く、他方ではまだ保存するために選択する必要がある最小値は何ですか?

多分私の問題に対するより良い解決策がありますか?

€: https://stackoverflow.com/a/3822355/3664953を解決策として使用することにしました。一度にいくつかのファイルを処理しなければならない可能性があるため、これを TPL で使用することにしました。イベントで使用するコード:

private void OnCreate(object sender, FileSystemEventArgs e)
{
  var fi = new FileInfo(e.FullPath);
  Console.WriteLine(e.Name + " " + DateTime.Now);
  System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
      DoWork(fi);
    }
  );
}

速すぎるために例外に遭遇しないように私が使用するコード:

private void DoWork(FileInfo file)
{
  var sw = new System.Diagnostics.Stopwatch();
  sw.Start();
  while(true)
  {
    if (IsFileLocked(file) == false)
    {
      break;
    }
    if(sw.ElapsedMilliseconds >= 30000)
    {
       _log.Status(Log.LL.Error, String.Format("Datei {0} ist gesperrt und kann nicht   
                    importiert werden.", file.Name));
       return; 
    }
  }
...

現時点で私が遭遇する唯一の問題は、作成/コピーされたファイルが100個ほどある場合、信じられないほど遅くなり、後でMSSQLがタイムアウトを返すことです。しかし、それは私が処理しなければならない問題ではありません:)

私を正しい方向に向けてくれた Ty ネオリスク。

4

0 に答える 0