Windows服务不断寻找文件

时间:2016-12-23 16:21:33

标签: c# windows asynchronous service task

很抱歉,如果这是一个愚蠢的问题,但我对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
    }
}

我的第一个问题:是否需要任何延迟或暂停?如果我没有任何暂停,那么此服务将不断查找远程服务器上的文件。这是我不得不担心的事情,还是一个非常轻量级的过程?

第二个问题:如果暂停而不是经常点击这个服务器会更好,这是一个更好的方法还是你会推荐什么?

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用计时器检查所需的文件和文件夹。这是大纲。

  1. 在服务类中添加Timer(继承ServiceBase类的一个)

    private 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.
    }