2016-12-23 2 views
0

Извините, если это глупый вопрос, но я довольно новичок в Windows Services и хочу убедиться, что я правильно понял подход к этой ситуации.Windows Service постоянно ищет файлы

У меня есть служба 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 
    } 
} 

Мой первый вопрос: Является ли какой-либо задержки или паузы даже необходимо? Если у меня нет паузы, эта служба будет постоянно искать файлы на удаленном сервере. Это что-то, о чем я должен беспокоиться, или это довольно легкий процесс?

Второй вопрос: если было бы лучше сделать паузу, а не постоянно ударять по этому серверу, это лучший подход или что вы порекомендуете?

public async Task DoWorkAsync(CancellationToken token) 
{ 
    while(!token.IsCancellationRequested) 
    { 
     ProcessFiles(); 
     await Task.Delay(TimeSpan.FromMilliseconds(10000), token).ContinueWith(_processFilesTask=> { }); 
    } 
} 

Благодарим за помощь!

+0

Вы не показано, как это выглядит для файлов, поэтому мы не можем сказать, если это легко или нет. Но обычно лучше иметь задержку, иначе могут быть занятые петли, которые просто сосут все ресурсы. И да, Task.Delay - это то, что вы хотите использовать –

+0

К сожалению, я обновил свой код. В этом примере, если пытается найти XML-файлы, упорядоченные по времени создания, и проверяет, существуют ли они. 75% дня, в этом каталоге не будет файлов. Было бы лучше использовать задержку вместо постоянного использования метода .GetFiles()? – Josh

+0

Вы определенно хотите какую-то паузу. Постоянное исследование сервера - огромная трата ресурсов центрального процессора и сети. Рассматривали ли вы просто использование [Таймер] (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)

    частный 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

Но какая польза от задержки, как у ОП? – IInspectable

Смежные вопросы