簡體   English   中英

C#Windows服務

[英]C# Windows Service

情境

我已經創建了Windows服務,但是無論何時啟動它,它都會立即停止。 該服務是從控制台應用程序隱藏的,該控制台應用程序用於訂閱事件並監視服務器上的進程。 如果進程發生任何事情(即被殺死),則該事件將觸發進程重新啟動。 我之所以告訴您,是因為以前的原始代碼如下所示:

原始控制台應用程序代碼:

    static void Main(string[] args)
    {
        StartProcess sp = new StartProcess();
        //Note the readline that means the application sits here waiting for an event!
        Console.ReadLine(); 
    }

現在,此代碼已被轉換為Windows服務,它實際上完全相同。 但是,該服務不會坐在那里等待,即使帶有readline,它也只是結束.....

新的Windows服務代碼:

    protected override void OnStart(string[] args)
    {
        ProcessMonitor pm = new ProcessMonitor();
        Console.ReadLine();
    }

思想

由於功能完全封裝在該單個類中(從字面上看,它確實已經啟動,設置了一些事件並等待)-我如何才能將服務實際坐在那里並等待? 它似乎無視閱讀路線。 但是,它可以完美地用作控制台應用程序,將其作為服務要方便得多。

通常,您會想要這樣的東西。 如Joe在評論中所述,您希望“ Start初始化並釋放對另一個線程的控制權,以確保您在30秒內返回。

private readonly ProcessMonitor processMonitor = new ProcessMonitor();

protected override void OnStart(string[] args)
{
    processMonitor.Start();
}

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

在服務中,沒有讀線的概念-沒有鍵盤。 如果在該調用中拋出異常,我不會感到驚訝。 您檢查過應用程序日志了嗎?

嗯...服務沒有控制台輸入/輸出。 因此,ReadLine不會阻止它執行。

ProcessMonitor做什么?

通常,對於服務,您的代碼位於線程中,該線程監視服務是已停止還是已暫停。

OnStart()必須完成並成功結束才能將服務視為“已啟動”

移動您的Console.ReadLine(); 到您的ProcessMonitor()構造函數中,並在該服務的構造函數中創建您的ProcessMonitor。 您的OnStart方法可以為空。 盡管有人說控制台方法不會使您的服務崩潰,但是這可能不是最佳實踐。 我猜想(在啟動計時器之后)保持服務運行的正確方法是使用帶有Thread.Sleep(60000)的while循環。

在編寫服務時,我將所有功能都放在“類庫”項目中,然后創建一個“控制台應用程序”項目來測試服務功能,然后創建一個Windows Service項目。 控制台應用程序和Windows服務項目都調用類庫中的一種方法來啟動服務功能。 如果使用此技術,則可以在類庫中調用Console.WriteLine,在運行控制台應用程序時可以查看它。 PS Topshelf被高估了,編寫Windows服務並不難。

public partial class ProcessMonitor_Service : ServiceBase
{

    public ProcessMonitor_Service()
    {
        InitializeComponent();            
        ProcessMonitor pm = new ProcessMonitor();
    }

    protected override void OnStart(string[] args)
    {

    }

    protected override void OnStop()
    {

    }
}

public class ProcessMonitor
{
    public ProcessMonitor()
    {
        // start timers
        Console.ReadLine(); 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM