2012-10-20 54 views
4

我知道這是一個已經問過的問題,但我找不到任何解決方案。這是我的服務。爲什麼計時器不能在windows服務中工作?

class Program : ServiceBase 
{ 
    private Timer _timer; 
    public Program() 
    { 
     ServiceName = "PrintTime"; 
    } 

    static void Main(string[] args) 
    { 
     Run(new Program()); 
    } 

    protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     _timer = new Timer(5000); 
     _timer.Elapsed += _timer_Elapsed; 
     _timer.Start(); 
    } 

    void _timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     WriteTimeToFile(); 
    } 

    protected override void OnStop() 
    { 
     _timer.Stop(); 
    } 

    private void WriteTimeToFile() 
    { 
     using (FileStream fs = new FileStream(@"d:\mylog.txt", FileMode.Append,   FileAccess.ReadWrite)) 
     { 
      StreamWriter streamWriter = new StreamWriter(fs); 
      streamWriter.Write(DateTime.Now.ToShortTimeString()); 
      streamWriter.Close(); 
      fs.Close(); 
     } 
    } 

} 

正如你可以看到我想寫currentTime到我Mylog.txt文件每5秒,但即使在2分鐘後沒有任何反應。如果我將WriteTimeToFile()函數放入OnStart方法中,它可以正常工作,但不能在定時器中使用。

任何幫助將不勝感激。

+1

通過附加Visual Studio的過程來調試您的服務。 – Adil

回答

1

好吧,幾個小時後,我發現計時器工作正常。計時器沒有錯。但問題是關於FileStream構造函數。 FileMode.Append只適用於FileAccess.Write

因此修復這行代碼解決了這個問題。

無論如何,謝謝你的關注。

using (FileStream fs = new FileStream(@"d:\mylog.txt", 
         FileMode.Append, FileAccess.Write)) 
5

什麼是計時器的命名空間?它需要是System.Timers.TimerSystem.Threading.Timer

在這裏看到:Best Timer for using in a Windows service

+0

'已用'表示Timers.Timer –

+0

它是System.Timer.Timer。但我也嘗試過System.Threading.Timer。相同的結果。 –

+0

我有一個Windows窗體計時器,因爲我使用工具箱插入它。有一次我使用工具箱...感謝提示! –

0

服務必須在Windows下運行的權限帳戶寫入到d:\目錄下。

檢查事件查看器中的異常,看看是否存在未經授權的訪問異常。

還在_timer_Elapsed方法中放置了一個斷點來驗證它是否被調用並逐步執行代碼。

+1

如果寫入d:\目錄被拒絕,那麼爲什麼將WriteTimeToFile()放入onStart方法的工作原理? –

相關問題