2011-08-18 95 views
0

我想創建我的第一個Windows服務,但很傷心......在我從services.msc手動啓動服務之後,消息'本地計算機上的服務啓動並停止。一些服務自動停止,是他們沒有工作要做」C#Windows服務 - 本地計算機上的服務已啓動,然後停止?

我相信一定有我的代碼中的一些錯誤...

namespace ConvertService 
{ 
public partial class Service1 : ServiceBase 
{ 
    public Service1() 
    { 
     this.ServiceName = "ConvertService"; 
     this.EventLog.Log = "Application"; 
    } 
    static void main() 
    { 

     ServiceBase.Run(new Service1()); 
    } 


    protected override void OnStart(string[] args) 
    { 
     Process pMP3 = new Process(); 
     pMP3.StartInfo.UseShellExecute = false; 
     pMP3.StartInfo.RedirectStandardOutput = true; 
     pMP3.StartInfo.FileName = @"d:\...path...\converter.exe"; 
     pMP3.StartInfo.Arguments = @"d:\...path...\tempamr.amr " + @"d:\...path...\tempmp3.mp3 " + @"-cmp3"; 
     pMP3.Start(); 
     pMP3.WaitForExit(); 
     Process pWAV = new Process(); 
     pWAV.StartInfo.UseShellExecute = false; 
     pWAV.StartInfo.RedirectStandardOutput = true; 
     pWAV.StartInfo.FileName = @"d:\...path...\converter.exe"; 
     pWAV.StartInfo.Arguments = @"d:\...path...\tempmp3.mp3 " + @"d:\...path...\tempwav.wav " + @"-cwav"; 
     pWAV.Start(); 
     pWAV.WaitForExit(); 

    } 

    protected override void OnStop() 
    { 
    } 
} 

}

原諒我,如果我做了愚蠢的錯誤。這是我第一個Windows服務。

PS。我已勾選'允許服務與桌面交互'

+1

查看Windows事件日誌。它可能有一些關於你的代碼轟炸未處理的異常。 –

回答

0

檢查以確保您的服務運行的帳戶可以訪問這些文件(包括.wav和.mp3文件的寫入訪問權限)。

您的代碼也可能導致未處理的異常。我不確定,但可能會在事件日誌中看到。你也可以讓你的服務將消息明確寫出到事件日誌中(就像例外情況一樣);看看這個鏈接:http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

3

您沒有爲OnStart方法創建運行線程。基本上,服務經理調用OnStart來啓動服務,並且該通話需要在約15秒左右完成。在內部,你應該創建一個帶有循環的線程,它隨着時間的推移實際調用你的代碼。像這樣:

protected CancellationTokenSource _tokenSource = null; 
protected Task _thread = null; 

protected override void OnStart(string[] args) 
{ 
    _tokenSource = new CancellationTokenSource(); 
    _thread = Task.Factory.StartNew(() => DoMyServiceLogic(), TaskCreationOptions.LongRunning, _tokenSource); 
} 

protected override void OnStop() 
{ 
    _tokenSource.Cancel(); 
} 

protected void DoMyServiceLogic() 
{ 
    while(!_tokenSource.Token.IsCancellationRequested) 
    { 
     // Do Stuff 
    } 
} 

您的服務並不真正遵循該模式;你不會連續做事,而應該更多地是一個控制檯程序。

實際上,這是因爲您的服務一旦完成OnStart方法就會停止執行任何操作。這就像在控制檯程序中完成Main時發生的情況 - 應用程序剛剛退出。

+0

+1是。學習如何編寫Windows服務時,這是一個非常常見的絆腳石。 –

+1

線程中的布爾標誌也是如此。使用一個AutoResetEvent。 –

+0

更新了更合適的'CancellationTokenSource'。 'AutoResetEvent'太舊了= D – Tejs

0

打開eventvwr.msc。在那裏你會看到關於爲什麼你的Windows服務停止工作的異常細節。順便說一句,你應該儘快離開OnStart方法,因爲你只有 有30秒完成OnStart方法。 關於MSDN有一篇很好的文章,描述了「如何調試」Windows服務。

相關問題