0

Windows サービスを思い通りに再起動する方法を知りたいです。

私はこの解決策を持っています:

private const int RestartTimeout = 60000; // 1 minute

 public void Control(string serviceName)
 {
     service = new ServiceController(serviceName);
 } 

public bool RestartService()
        {
            try
            {
                Control("MyService");
                service.Refresh();
                if (service.Status != ServiceControllerStatus.Stopped)
                {
                    mytimer.Enabled = false;
                    service.Stop();
                    int i = 0;
                    service.Refresh();

                    while (service.Status == ServiceControllerStatus.Stopped || service.Status == ServiceControllerStatus.StopPending)
                    {
                        i++;
                        Thread.Sleep(100);
                        if (i >= RestartTimeout / 100)
                        {
                            return false;
                        }
                    }
                    service.Start();
                    return true;
                }

                service.Start();

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

while ループに到達した時点でタイムアウト エラーが発生しました。サービスが停止されたからでしょうか?

ここで実際に達成しようとしているのは、サービスを停止し、サービスを再開する前に 1 分間スリープすることです。

助けてください。ありがとう!

4

2 に答える 2

1

私はこの方法で解決しました (もちろん、アプリケーションを管理者権限で起動する必要があります!):

ちょっとしたアドバイス: 問題を複数の部分 (複数の方法) に分割してください。バグが発生した場合、それをいくつかの行に絞り込むことができるからです。

    public void RestartService(string serviceName)
    {
        if (StopService(serviceName) == true)
        {
            Thread.Sleep(60000);
            if (StartService(serviceName) == true)
            {
                MessageBox.Show("Service started succesfully");
            }
       }
    }

    private bool StartService(string serviceName)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running);
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }
    }

    private bool StopService(string serviceName)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            if (service.Status != ServiceControllerStatus.Stopped)
            {
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped);
                return true;
            }
            else if (service.Status == ServiceControllerStatus.Stopped)
            {
                return true;
            }
            return false;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
            return false;
        }
    }
于 2013-09-24T07:08:59.563 に答える