0

そのため、プログラムしたサービスを実行しようとしていますが、起動しようとすると何らかの理由でこのエラーが発生します:

Error 1053: the service did not respond to the start or control request in a timely fashion

私のコードはかなり基本的です。

static void Main(string[] args)
    {
        try
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Program() 
            };
            ServiceBase.Run(ServicesToRun);
        }
        catch (Exception ex)
        {
            string SourceName = "WindowsService.ExceptionLog";
            if (!EventLog.SourceExists(SourceName))
            {
                EventLog.CreateEventSource(SourceName, "Application");
            }

            EventLog eventLog = new EventLog();
            eventLog.Source = SourceName;
            string message = string.Format("Exception: {0} \n\nStack: {1}", ex.Message, ex.StackTrace);
            eventLog.WriteEntry(message, EventLogEntryType.Error);
        }
    }

    public Program()
    {
        this.ServiceName = "FetchFeed";
    }

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

        //TODO: place your start code here
    repeat: FetchFeed();
        Thread.Sleep(3600000);
        goto repeat;
    }

    protected override void OnStop()
    {
        base.OnStop();

        //TODO: clean up any variables and stop any threads
    }

private static void FetchFeed()
{
    //Some HTTP requests and retrieval.
}

これはインストーラークラスです:

[RunInstaller(true)]
public class Service_Installer : Installer
{
    public Service_Installer()
    {
        ServiceProcessInstaller processInstaller = new ServiceProcessInstaller();
        ServiceInstaller serviceInstaller = new ServiceInstaller();

        //set the privileges
        processInstaller.Account = ServiceAccount.LocalSystem;

        serviceInstaller.DisplayName = "FetchFeed";
        serviceInstaller.StartType = ServiceStartMode.Manual;

        //must be the same as what was set in Program's constructor
        serviceInstaller.ServiceName = "FetchFeed";

        this.Installers.Add(processInstaller);
        this.Installers.Add(serviceInstaller);
    }
}

エラーの背後にある理由は何ですか? FetchFeed() が例外のないスタンドアロン アプリケーションとして動作することを確認しました。

4

2 に答える 2

1

適切なタイマーの使用

public class YourService
{
       var tim = new System.Timers.Timer(60 * 60 * 1000); // 1 hour

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

        tim.AutoReset = true;
        tim.Elapsed += new System.Timers.ElapsedEventHandler(tim_Elapsed);
        tim.Enabled = true;
        // first time run
        ThreadPool.QueueUserWorkItem(WaitCallback(FetchFeed));
    }

    static void tim_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
          FetchFeed();
    }
}
于 2012-08-06T14:12:45.990 に答える
1
repeat: FetchFeed();
Thread.Sleep(3600000);
goto repeat;

これがあなたの問題です。Windows サービスは 30 秒以内に応答する必要があるため、Windows はサービスが正常に開始されたことを認識します。

このコードを使用すると、唯一のスレッドがブロックされ、サービスは何にも応答しなくなります。

別のスレッドまたは別の方法でこれを試してください。

a を使用するのは本当にダメなので、別の方法をお勧めしgotoます:)

また、理解を深めるために、Windows サービスに関するいくつかのチュートリアルと基本的なドキュメントも確認してください。

于 2012-08-06T13:44:38.283 に答える