0

クラスを実行するために15分間隔ごとにクラスライブラリを作成するWindowsサービスを作成しました。

マシンにWindowsサービスを展開すると正常に動作し、タイマーは正常に動作し、15分ごとにクラスライブラリを呼び出しますが、サーバーに展開すると、onstartでのみ正常に動作します。私のクラスライブラリを呼び出すと思われる分が発生していません。問題を特定するためにここで何を調べればよいか教えてください

ここに私のコードがあります

    public partial class Service1 : ServiceBase
{
    private Timer _timer;
    private DateTime _lastRun = DateTime.Now;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        log4net.Config.XmlConfigurator.Configure();

        _timer = new Timer(10 * 60 * 1000); // every 10 minutes
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        Shell Distribute= new Shell();
        Distribute.Distribute();
_timer.start();//this line was missed in my original code
    }

    protected override void OnStop()
    {
        this.ExitCode = 0;
        base.OnStop();

    }
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
       //if (_lastRun.Date < DateTime.Now.Date)
        //{

try
{
_timer.Stop();
Shell Distribute= new Shell();
Distribute.Distribute();
}
catch(exception ex)
{}
finally
{

            _timer.Start();
}
         //}
        }

    }
}

私はログオンの問題を強く信じていますが、同じアカウントを使用してテストサーバーでこのサービスを開始または再起動すると、タイマーだけが機能しない場合、2 つの理由で確信が持てません。コードはまったく同じなので、同じアカウントを使用するローカル マシンに基づいてタイマーが動作するので、コードについてはあまり心配しません。前もって感謝します。

4

1 に答える 1

0

タイマーに基づいてサービスが機能する理由がわかりません。何が起こっているのかを知るために、以下のようなコードにログを追加するだけですが、幸いなことにそれは魅力のように機能します。

 protected override void OnStart(string[] args)
    {

        log4net.Config.XmlConfigurator.Configure();
        log.Debug("Service Called when Onstart");
        _timer = new Timer(10 * 60 * 1000); // every 10 minutes
        log.Debug("calling Distributor Method");
        Shell Distributor = new Shell();
        Distributor.Distribute();

        log.Debug("calling timer Elapsed");
       _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
       log.Debug("start the timer");
       _timer.Start();

    }

    protected override void OnStop()
    {
        log.Debug("stop the timer in OnStop method");
        this.ExitCode = 0;
        base.OnStop();

    }
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {

        log.Debug("IN Timer Elapsed method");
        try
        {
            log.Debug("IN try block and calling timer stop function");
            _timer.Stop();
            log.Debug("Distributor Method Called from try block");
            Shell Distributor = new Shell();
            Distributor.Distribute();


        }
        catch (Exception ex)
        {
            log.Debug("IN Catch Block");
            log.Debug(ex.Message); 
        }
        finally
        {
            _lastRun = DateTime.Now;
            log.Debug("IN Final Block");
            log.Debug("start the timer");
            _timer.Start();
            log.Debug("Exit the Timer Elapsed Method");
        }
于 2012-04-13T04:58:19.540 に答える