如何在发生未处理的异常后重新启动Windows服务

时间:2015-06-15 03:58:47

标签: c# windows-services unhandled-exception

我有一个控制台应用程序,它是一个FTP服务器。此控制台应用程序正常工作现在,我想使用Windows服务运行此FTP服务器。

我有一个未处理的异常捕获器,它捕获一个未处理的异常。发生此异常后,我想停止服务,破坏FTP服务器的类,将其延迟10秒并重新启动服务。

以下是我的代码(如果没有未处理的异常但是我想成功停止并重新启动服务,则ftp服务器和服务正常工作。此代码会停止服务,但不会重新启动它)。有什么想法吗?

public partial class FTPService : ServiceBase
{
    private static FtpServer _ftpServer;
    public FTPService(string[] args)
    {
        InitializeComponent(); 

        string eventSourceName = "Ftp Server Events";

        eventLog1 = new System.Diagnostics.EventLog();

        string logName = "Ftp Server Log";

        if (args.Count() > 0)
        {
            eventSourceName = args[0];
        }

        if (args.Count() > 1)
        {
            logName = args[1];
        } 

        eventLog1 = new System.Diagnostics.EventLog();

        if (!System.Diagnostics.EventLog.SourceExists(eventSourceName))
        {
            System.Diagnostics.EventLog.CreateEventSource(eventSourceName, logName); 

        } 

        eventLog1.Source = eventSourceName; 
        eventLog1.Log = logName;

        if (!System.Diagnostics.EventLog.SourceExists("Ftp Server Events"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "Ftp Server Events", "Ftp Server Log");
        }

        this.ServiceName = "FTP Service";

        this.AutoLog = true;
    }

    public static void Main(string[] args)
    {
        ServiceBase.Run(new FTPService(new string[0]));
    }

    protected override void OnStart(string[] args)
    {
        base.OnStart(args);

        var database = new Database(); // Gets database details as FTP server tals to database.
        var configurationManager = new ConfigurationManagerWrapper(); // Same as above

        _ftpServer = new FtpServer(new Assemblies.Ftp.FileSystem.StandardFileSystemClassFactory(database, configurationManager));
        _ftpServer.Start(); //Starts the service (FTP Server works fine if there is no handled exception)

        eventLog1.WriteEntry("Started");

        FtpServerMessageHandler.Message += MessageHandler_Message;

        AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;

    }

    protected override void OnStop()
    {
        _ftpServer.Stop(); // This calls the destructor for FTP Server, to close any TCP Listening connections, etc
        base.OnStop(); // Here I stop the service itself.
        eventLog1.WriteEntry("Stopped");
        Thread.Sleep(10000);
    }

    protected void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) // unhandled exception handler
    {
        eventLog1.WriteEntry(e.ExceptionObject.ToString());
        Thread.Sleep(5000);
        OnStop(); // Calls onstop  which stops FTP Server and destroys previous objects of FTP server

        var serviceMgr = new ServiceController();
        serviceMgr.Start(); // Here I want to restart the service (it doesn't work)
    }


}

1 个答案:

答案 0 :(得分:0)

请尝试以下操作:

services.msc - >您的服务 - >属性 - >回收

为您设置属性

<强> - &GT;保存 - &gt;您的服务 - &gt;重新启动