申し訳ありませんが、これは愚かな質問ですが、私はWindowsサービスを初めて熟知しており、この状況に近づける適切な方法を理解したいと考えています。Windowsサービスは常にファイルを探しています
ファイルを監視するためのWindowsサービスがあります。これらのファイルが存在する場合は、それらのファイルが処理されます。私は古い開発者のコードを見ていて、ファイルが存在しなければThread.Sleep()を使いました。私はこれが悪い習慣であることを理解しており、これがサービスをロックするのを最初から見てきました。
private Task _processFilesTask;
private CancellationTokenSource _cancellationTokenSource;
public Start()
{
_cancellationTokenSource = new CancellationTokenSource();
_processFilesTask = Task.Run(() => DoWorkAsync(_cancellationTokenSource.Token))
}
public async Task DoWorkAsync(CancellationToken token)
{
while(!token.IsCancellationRequested)
{
ProcessFiles();
//await Task.Delay(10000);
}
}
public Stop()
{
_cancellationTokenSource.Cancel();
_processFilesTask.Wait();
}
private void ProcessFiles()
{
FileInfo xmlFile = new DirectoryInfo(Configs.Xml_Input_Path).GetFiles("*.xml").OrderBy(p => p.CreationTime).FirstOrDefault();
if(xmlFile != null)
{
//read xml
//write contents to db
//move document specified in xml to another file location
//delete xml
}
}
私の最初の質問:遅延または一時停止の任意の並べ替えでも必要とされている
ここに私のロジックの単純化した例がありますか?一時停止がない場合、このサービスは常にリモートサーバー上のファイルを探します。これは私が心配する必要があるか、それともかなり軽量なプロセスですか?
第2の質問:このサーバーに常時接続するのではなく、一時停止する方がよい場合は、これをより良いアプローチにするか、何をお勧めしますか?
public async Task DoWorkAsync(CancellationToken token)
{
while(!token.IsCancellationRequested)
{
ProcessFiles();
await Task.Delay(TimeSpan.FromMilliseconds(10000), token).ContinueWith(_processFilesTask=> { });
}
}
ありがとうございました!
あなたはそれは軽量だかどう我々が言うことができないので、それはファイルを検索する方法を示していません。しかし、通常は遅延がある方が良いでしょう。さもなければ、すべてのリソースを吸うだけのビジーなループがあるかもしれません。そしてはい、Task.Delayはあなたが使いたいものです –
私はコードを更新しました。この例では、作成時に順序付けられた.xmlファイルを検索し、存在するかどうかを確認します。 1日の75%、このディレクトリにはファイルはありません。 .GetFiles()メソッドを常に実行するのではなく、遅延を使用する方が良いでしょうか? – Josh
あなたは間違いなく何らかの休止を望んでいます。サーバーのプロービングは、CPUとネットワークリソースの膨大な浪費です。 [Timer](https://msdn.microsoft.com/en-us/library/system.timers.timer(v = vs.110).aspx)だけを使用したことがありますか? [FileSystemWatcher](https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v = vs.110).aspx)アプローチもありますが、信頼できるものではないことがわかりましたリモートフォルダ/ファイルを監視するときに使用します。 – itsme86