2011-10-12 40 views
2

我创建了一个C#Windows服务应用程序,该应用程序启动一个FileSystemWatcher来监视创建文件的目录。当找到该文件时,我实例化一个自定义类来解析文件(CSV)并用它的内容调用Web服务。该服务有点异步,并返回一个唯一的数字,必须用于随后的调用来检查其进度。在我的流程类中,我创建了一个计时器来持续检查工作是否完成。我是dispose ing和close ing我的计时器,当我完成它,但我只是想确保我的类将垃圾收集,我不会有任何内存泄漏。使用FileSystemWatcher和Timer进行Windows服务 - 确保一切都得到处理

的代码看起来像这样(剪断,为了简洁):

我的主要服务类:

protected override void OnStart(string[] args) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = "path"; 
     watcher.Filter = "file"; 
     watcher.Created += new FileSystemEventHandler(watcher_Created); 
     watcher.EnableRaisingEvents = true; 
    } 

    static void watcher_Created(object sender, FileSystemEventArgs e) 
    { 
     FileProcessor p = new FileProcessor(); 
     p.Process(e.FullPath); 

     //Will this instance of p stick around until the timer within it is finished? 
    } 

FileProcessor.cs

class FileProcessor 
    { 
     private System.Timers.Timer timer = new System.Timers.Timer(); 
     private string id; 

     public FileProcessor() 
     { 
      timer.Elapsed += new ElapsedEventHandler(OnTimer); 
      timer.Enabled = false; 
      timer.AutoReset = true; 
     } 

     public void Process(string filename) 
     { 
      //Read file <snipped> 

      //Call web service and get id 
      id = CallWebService(); 

      //Create a timer for 10 seconds and start it 
      timer.Interval = 10000; 
      timer.Enabled = true; 
     } 


     private bool IsFinished(string id) 
     { 
      //Call web service to see if job is finished, true if finished 
      //<snipped> 
     } 


     private void ProcessResults() 
     { 
      //Job is finished, process results 

      //Call cleanup method to dispose of timer 
      Cleanup(); 
     } 

     private void OnTimer(object source, ElapsedEventArgs e) 
     { 
      if (!IsFinished(id)) 
      { 
       //Keep timer running, check result again next timer event 
       return; 
      } 
      else 
      { 
       //Stop timer 
       timer.Stop(); 

       //Process Results 
       ProcessResults(response); 
      } 
     } 


     private void Cleanup() 
     { 
      timer.Close(); 
      timer.Dispose(); 
     } 
    } 

我的问题是我应该“p”的实例在我的计时器被销毁之前(不是被GC'ed)?它会被毁坏吗?我的FileProcessor类是否需要实现IDisposable,以便我可以将它包装在使用块中?我并不担心这是单线程的,因为我只希望它每天处理一个文件,并且完成该过程不应超过10分钟,然后返回到下一个要创建的文件。

回答

5

你在正确的轨道上。 FileSystemWatcher实现了Component类,该类需要您在使用后进行处理。既然是这样,正确的做法是让你的类如你所建议的那样实现IDisposable。

因为你将有FileProcessor对象住的时间长一段时间,你将无法使用using声明。这是因为对象会在完成其工作之前试图将其处理掉。

因此,我将在FileProcessor上执行事件以在处理完成时通知消费者。完成此操作后,我会在FileProcessor对象上调用Dispose方法。该处置方法应执行该对象所需的全部清理 - IE:定时器,观察者等

供您参考,this is a good article其中规定了有关何时以及如何使用IDisposable接口的一些准则。此外,作为一种良好的做法,您将希望将调用包装在消费者的try/catch块中 - 您需要确保无论发生什么情况,您都试图释放资源。

+0

是的,好东西 - 也调查'try/finally'块。 –

+0

如何通知我的主服务类(称为FileProcessor的类)它已完成? – Jay

+0

Jay,如果您需要事件帮助,请查看http://msdn.microsoft.com/zh-cn/library/aa645739(v=vs.71).aspx –

相关问题