Извините, если это глупый вопрос, но я довольно новичок в 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=> { });
}
}
Благодарим за помощь!
Вы не показано, как это выглядит для файлов, поэтому мы не можем сказать, если это легко или нет. Но обычно лучше иметь задержку, иначе могут быть занятые петли, которые просто сосут все ресурсы. И да, Task.Delay - это то, что вы хотите использовать –
К сожалению, я обновил свой код. В этом примере, если пытается найти XML-файлы, упорядоченные по времени создания, и проверяет, существуют ли они. 75% дня, в этом каталоге не будет файлов. Было бы лучше использовать задержку вместо постоянного использования метода .GetFiles()? – Josh
Вы определенно хотите какую-то паузу. Постоянное исследование сервера - огромная трата ресурсов центрального процессора и сети. Рассматривали ли вы просто использование [Таймер] (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