私は選択したフォルダに* .logファイルをリッスンするアプリケーションを持っています。私はFileSystemWatcher
を使用しました。File.Existsまで待つ方法
しかし、問題があります。
- は
- が適切なものにtxtファイル(いくつかのランダムなファイル名)
- 変更に* .txtの名前を、それを解凍します* .gzをファイルを作成します。そのファイルを作るための責任を他のアプリでは、手順に従って取り* .log拡張子付き。
この動作は変更できません。
したがって、* .gzファイルと* .txtファイルには2 FileSystemWatcher
が作成されました。どうして?このアプリケーションはgzファイルを解凍しないことがあり、txtファイルの名前を最終的な* .logファイルに変更しないことがあります。
FileSystemWatcher2
キャッチtxtファイル(ほとんどの場合、次の1000msでログに名前が変更されます)txtファイルが存在するかどうかを確認するまでに時間がかかることがあります(そうでない場合は、 .logファイル)。
質問は、UIがフリーズしないようにThread.Sleep()
なしでファイルが存在するかどうかを確認する方法です。
私はそれが明確ではないかと思いますが、私はそれをより良く記述しようとします。私はこれが複雑な問題だと思う。
いくつかのサンプルコード:
ウォッチャーGZファイルの:
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
//this is for gz files in case if gz file is not unpacked automatically by other app
//I need to wait and check if gz was unpacked, if not, unpack it by myself,
//then txt watcher will catch that
Thread.Sleep(5000);
if (File.Exists(e.FullPath))
{
try
{
byte[] dataBuffer = new byte[4096];
using (System.IO.Stream fs = new FileStream(e.FullPath,
FileMode.Open,
FileAccess.Read))
{
using (GZipInputStream gzipStream = new GZipInputStream(fs))
{
string fnOut = Path.Combine(path_to_watcher,
Path.GetFileNameWithoutExtension(e.FullPath));
using (FileStream fsOut = File.Create(fnOut))
{
StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
}
}
}
}
catch { //Ignore }
}
}
ウォッチャーtxtファイルについて:
private void fileSystemWatcher2_Created(object sender, FileSystemEventArgs e)
{
//this is for txt file
Thread.Sleep(3500);
if (File.Exists(e.FullPath))
{
//make my actions
}
else
{
//make my actions
}
}
すべての 'のThread.sleep()'んです放棄THEスレッド、彼らは他のタスクに使用することができるように、それが使用しているコンピュータのリソースを解放:ここ
は証拠です。いくつかのシナリオでは理想的ではありません(1ミリ秒の最小単位があるため)が、達成しようとしているものについてはうまくいくかもしれません。 –@RobertHarveyこれについてのドキュメントがありますか?私の経験から、Thread.Sleepは、時間が経過するまでスレッドがそれ以上の命令を処理しないようにします。 MSDNから: 'スレッドは、指定された時間、オペレーティングシステムによって実行のためにスケジュールされません。 ' – CodingGorilla
@CodingGorilla:はい、そうです。スレッドは他のタスクのために保持しているリソースをブロックし、解放します。基本的には「次のnミリ秒間は何もしないので、その間に別のことをすることができます」と言っています。 –