2016-01-03 5 views
1

У меня проблема с сервисом Windows.C# Windows Service While loop

protected override void OnStart(string[] args) 
{ 
    while (!File.Exists(@"C:\\Users\\john\\logOn\\oauth_url.txt")) 
    { 
     Thread.Sleep(1000); 
    } 
... 

я должен ждать конкретный файл, таким образом, в то время как цикл необходимо, но услуга не будет в состоянии начать с петлей, как это. Что я могу сделать, чтобы иметь запущенную службу и механизм, который проверяет, существует ли файл?

+3

Не делать это в OnStart. И не используйте \\, разделитель \ –

ответ

3

Лучшим вариантом является наличие таймера System.Timers.Timer в вашем сервисе.

System.Timers.Timer timer = new System.Timers.Timer(); 

В конструкторе добавить обработчик для Elapsed события:

timer.Interval = 1000; //miliseconds 
timer.Elapsed += TimerTicked; 
timer.AutoReset = true; 
timer.Enabled = true; 

Затем в методе OnStart начать этот таймер:

timer.Start(); 

В обработчике событий делать свою работу:

private static void TimerTicked(Object source, ElapsedEventArgs e) 
{ 
    if (!File.Exists(@"C:\Users\john\logOn\oauth_url.txt")) 
     return; 

    //If the file exists do stuff, otherwise the timer will tick after another second. 
} 

класс минимальный сервис будет выглядеть примерно так:

public class FileCheckServivce : System.ServiceProcess.ServiceBase 
{ 
    System.Timers.Timer timer = new System.Timers.Timer(1000); 

    public FileCheckServivce() 
    { 
     timer.Elapsed += TimerTicked; 
     timer.AutoReset = true; 
     timer.Enabled = true; 
    } 

    protected override void OnStart(string[] args) 
    { 
     timer.Start(); 
    } 

    private static void TimerTicked(Object source, ElapsedEventArgs e) 
    { 
     if (!File.Exists(@"C:\Users\john\logOn\oauth_url.txt")) 
      return; 

     //If the file exists do stuff, otherwise the timer will tick after another second. 
    } 
} 
2

Я бы рассмотреть вопрос об использовании FileSystemWatcher, как это именно то, что она предназначена для того, чтобы следить за изменениями в файловой системе. Как только событие будет поднято в папке, вы можете проверить, существует ли этот конкретный файл.

пример по умолчанию в MSDN на самом деле показывает мониторинг .txt файла https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx