2013-10-17 114 views
7

我試圖將控制檯應用程序轉換爲Windows服務。我試着讓服務的onstart方法在我的類中調用一個方法,但我似乎無法使其工作。我不確定我是否正確地做到了這一點。我在哪裏寫在類信息服務C#將控制檯應用程序轉換爲服務

protected override void OnStart(string[] args) 
{ 
    EventLog.WriteEntry("my service started"); 
    Debugger.Launch(); 
    Program pgrm = new Program(); 
    pgrm.Run(); 
} 

從評論:

namespace MyService { 
static class serviceProgram { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() { 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] { 
    new Service1() 
    }; 
    ServiceBase.Run(ServicesToRun); 
    } 
} 
} 
+0

您是否將項目類型從控制檯應用程序更改爲Windows應用程序?你打電話給「ServiceBase.Run」嗎? –

+0

是的,我在我的解決方案中創建了一個新項目作爲Windows服務。 – user2892443

+0

namespace MyService { static class serviceProgram { ///

///應用程序的主要入口點。 /// static void Main() { ServiceBase [] ServicesToRun; ServicesToRun = new ServiceBase [] { new Service1() }; ServiceBase.Run(ServicesToRun); } } } – user2892443

回答

8

Windows服務上的MSDN documentation非常好,並且擁有開始所需的一切。

您遇到的問題是因爲您的OnStart實現,只能用於設置服務,因此它已準備好啓動,該方法必須立即返回。通常你會在另一個線程或定時器上運行大量的代碼。請參閱OnStart的頁面進行確認。

編輯: 不知道你的Windows服務會做什麼,這是很難告訴你如何實現它,但是讓我們假設你想運行一個方法正在運行的服務,每10秒,而:

public partial class Service1 : ServiceBase 
{ 
    private System.Timers.Timer _timer; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
#if DEBUG 
     System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration 
#endif 

     _timer = new System.Timers.Timer(10 * 1000); //10 seconds 
     _timer.Elapsed += TimerOnElapsed; 
     _timer.Start(); 
    } 

    private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) 
    { 
     // Call to run off to a database or do some processing 
    } 

    protected override void OnStop() 
    { 
     _timer.Stop(); 
     _timer.Elapsed -= TimerOnElapsed; 
    } 
} 

這裏,OnStart方法在設置定時器後立即返回,TimerOnElapsed將在工作線程上運行。我還添加了一個調用System.Diagnostics.Debugger.Launch();,這將使調試更容易。

如果您還有其他一些要求,請編輯您的問題或發表評論。

+0

這就是我的問題,林不知道要在OnStart實施中。你是什​​麼意思把大部分代碼放在單獨的線程或定時器上?如果該過程未從OnStart調用,該過程如何知道如何運行我的代碼。預先感謝您的耐心,服務對我來說是全新的 – user2892443

+1

@ user2892443用一個例子編輯我的答案。 – ChrisO

2

自己做最大的青睞和使用topshelf http://topshelf-project.com/創建您服務。我所看到的沒有什麼更容易的。他們的文檔是supperb,部署不能簡單。 c:/ service/service.exe安裝路徑。

+1

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分,並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/評論/低質量帖/ 18747979) – ViRuSTriNiTy

相關問題