2016-12-23 7 views
0

申し訳ありませんが、これは愚かな質問ですが、私は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=> { }); 
    } 
} 

ありがとうございました!

+0

あなたはそれは軽量だかどう我々が言うことができないので、それはファイルを検索する方法を示していません。しかし、通常は遅延がある方が良いでしょう。さもなければ、すべてのリソースを吸うだけのビジーなループがあるかもしれません。そしてはい、Task.Delayはあなたが使いたいものです –

+0

私はコードを更新しました。この例では、作成時に順序付けられた.xmlファイルを検索し、存在するかどうかを確認します。 1日の75%、このディレクトリにはファイルはありません。 .GetFiles()メソッドを常に実行するのではなく、遅延を使用する方が良いでしょうか? – Josh

+0

あなたは間違いなく何らかの休止を望んでいます。サーバーのプロービングは、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

答えて

0

タイマーを使用して、目的のファイルとフォルダを確認できます。ここに概要があります。

  1. あなたのサービス・クラスで(ServiceBaseクラスを継承しています1)

    プライベートでSystem.Timers.Timer myTimerをタイマーを追加します。

  2. OnStartメソッドでタイマーを初期化します。

    protected override void OnStart(string[] args) 
    { 
        // Set the Interval to 1 seconds (1000 milliseconds). 
        myTimer = new System.Timers.Timer(1000); 
    
        // Hook up the Elapsed event for the timer. 
        myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
    
        myTimer.Enabled = true; 
    
    } 
    
  3. 経過イベントハンドラを定義します。

    private void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
        //Write your file handling logic here. 
        //Service will execute this code after every one second interval 
        //as set in OnStart method. 
    } 
    
+0

ここでタイマーを使用する利点は何ですか? – IInspectable

+0

タイムドイベントサービスを使用すると、指定された間隔でファイルがチェックされます。 –

+0

しかし、OPのように遅れを取ることよりも何が利点ですか? – IInspectable

関連する問題