1

私は、誰も知らないうちに、コンピューターのバックグラウンドでWindowsサービスを常に実行させようとしています。Windowsサービスは、電子メールの受信トレイのコンテンツをダウンロードしてデータベースに配置します。

私のWindowsサービスは停止するために継ぎ目があります-それは60秒ごとにログに入り、それから約10分で停止しますか?

以下にコードを投稿しました。誰かが理由を見て、教えてもらえますか?

どんな助けでも大歓迎です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;

namespace EmailWindowsService
{
    public partial class MyEmailService : ServiceBase
    {
        private DateTime lastRun;
        private bool flag = true;
        private static System.Timers.Timer aTimer;
        public MyEmailService()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource")) // every thing the windows service does is logged in server explorer
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
            }
            eventLogEmail.Source = "MySource";
            eventLogEmail.Log = "MyNewLog";

            // Timer Code
             aTimer = new System.Timers.Timer(1 * 60 * 1000); // 60 seconds
             aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
             aTimer.Enabled = true;
            // Timer Code
        }

        protected override void OnStart(string[] args)
        {
            flag = true;
            lastRun = DateTime.Now;
            eventLogEmail.WriteEntry("Started");
        }

        protected override void OnStop()
        {
            eventLogEmail.WriteEntry("Stopped");
        }
        protected override void OnPause()
        {
            eventLogEmail.WriteEntry("Paused");
        }
        protected override void OnContinue()
        {    
            eventLogEmail.WriteEntry("Continuing");
        }
        protected override void OnShutdown()
        {
            eventLogEmail.WriteEntry("ShutDowned");
        }

        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            RetriveEmailClass Emails = new RetriveEmailClass();
            if (flag == true)
            {
                eventLogEmail.WriteEntry("In getting Email Method");
                Emails.ServiceEmailMethod();
                lastRun = DateTime.Now;
                flag = false;
            }
            else if (flag == false)
            {
                if (lastRun.Date < DateTime.Now.Date)
                {
                    Emails.ServiceEmailMethod();
                    eventLogEmail.WriteEntry("In getting Email Method");
                }
            }
        }       
        }
    }
4

4 に答える 4

0

Windowsサービスの実行が停止するいくつかの理由。

1. Unhandled exception in your code. Looking from you code snippet, please add exception handling in the OnTimedEvent() method.
2. You service may crashed for some reason. In this case, you can go to event viewer to find out the reason for the failure. 

お役に立てれば。

于 2012-05-08T14:24:55.113 に答える
0

クラスにエラーがないことを確認してください。エラーがあると、サービス全体が停止する可能性があります。また、タイマーをメソッドに入れて、それを呼び出すだけで、サービスコードには含めないでください。

Windowsサービスは、常に、のメソッドを呼び出すだけの空のシェルとして作成する必要があります。

于 2012-05-11T08:44:24.433 に答える
0

ほとんどの場合、未処理の例外があります。を使用しているため、非表示になっていますSystem.Timers.Timer。そのタイマーは、アプリをクラッシュさせるのではなく、未処理の例外をすべて食べます。

つまり、アプリは正常に動作しているように見えても、正常に動作していないように見える場合があります。タイマーコールバックのtry/catchは、それを証明します。

System.Threading.Timerそのようには機能しないので、代わりに使用することをお勧めします。

于 2012-05-11T08:49:51.217 に答える
-1

Emails.ServiceEmailMethodメソッドのソースを除いて、コードは十分に単純です。メソッドは例外を生成しますか?もしそうなら、それらはあなたのタイマーメソッドに閉じ込められていません。試す:

try { Emails.ServiceEmailMethod(); }  
catch (Exception ex) { eventLogEmail.WriteEntry(ex.Message); }
于 2012-05-08T14:23:38.677 に答える