4

5 分ごとにメールの受信トレイをデータベースに入力する Windows サービスを構築しました。

Windows サービス内でクラスを使用しました。クラスはメールを取得してデータベースに書き込みます。クラスはテスト済みで動作します。

Windows サービスで行う必要があるのは、タイマーを使用して 5 分ごとにクラスを呼び出すことだけですが、Windows サービスをテストすることさえできないため、何が起こっているのかわかりません。

テストする方法がある場合は、テストする方法を教えてください。または、運が良ければ、うまくいくことを祈ってください笑。

また、サービスをテストするたびにアンインストールして再インストールする必要がありますか、それとも更新サービス オプションはありますか? これに答えてください。私の主な質問ではありませんが、本当に興味があります。

これは私のWindowsサービスです。テストできないので、驚くべきエラーを指摘できれば。誰かがそれを見ることができれば、私のタイマーが間違っているのではないかと思いますか?

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 Timer scheduleTimer1 = null;
        private DateTime lastRun;
        private bool flag;

        public MyEmailService()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
            }
            eventLogEmail.Source = "MySource";
            eventLogEmail.Log = "MyNewLog";

            scheduleTimer1 = new Timer();
            scheduleTimer1.Interval = 5 * 60 * 1000;
            scheduleTimer1.Elapsed += new ElapsedEventHandler(scheduleTimer_Elapsed);
        }

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

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

        protected void scheduleTimer_Elapsed(object sender, 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

5 に答える 5

3

確かにあなたはそれをテストすることができます。あなたに必要なのは

  1. サービスを開始する
  2. 5分後に予想される呼び出しをトリガーすることを観察します
  3. (予想される呼び出しが 5 分ごとにさらに数回トリガーされることに注意してください)

これを手動でテストするか、(できれば) 自動テスト ハーネスを作成/使用して、必要な回数だけ繰り返し確実にテストすることができます。これは、単純なバッチ ファイルを使用しても可能です。

タイマーが正しく動作していることを検出するには、そのログ ファイルを調べます。もちろん、呼び出されたクラスメソッドをハードコーディングする代わりに構成可能にする場合にも役立ちます。したがって、受信トレイをあふれさせないダミーのワーカー クラスを使用して、自動化されたテストを実行できます :-)

さらにテストしやすくするために、サービス クラスからタイミング ロジックを抽出して、通常のアプリケーションから実行できるようにすることもできます。その後、NUnit などの単体テスト フレームワークを使用しても、さらに簡単にテストできます。これにより、さまざまなタイミング間隔などを使用して、より徹底的なテストを行うことができます。また、サービス クラス自体は、他のクラスを起動して呼び出すだけのほとんど空のシェルになります。実際のプログラム ロジック (つまり、失敗する可能性のあるすべてのコード) を含むすべてのクラスが単体テストされ、正常に動作することを確認した場合、アプリ全体が小さな部分から統合されたときにも正しく動作することを確信できます。 .

アップデート

コードを見ると、どこにも初期化していないように見えるflagため、デフォルト値はfalse. コンストラクターで初期化する必要がありますtrue。そうしないと、タイマーが適切に起動しても、メールレトリーバーが呼び出されません。

間隔を 1 分に設定するには、私の最初の推測は次のようになります。

scheduleTimer1.Interval = 1 * 60 * 1000;
于 2012-05-08T07:17:28.427 に答える
3

James Michael Hare は、彼のブログで、彼が作成した非常に優れたテンプレート/フレームワークについて書いています。これにより、Windows サービスの開発 (およびデバッグ) がはるかに簡単になりました: C# ツールボックス: デバッグ可能な自己インストール Windows サービス テンプレート (1/2)

すぐに使い始めるために必要なすべての基本事項を提供します。そして何よりも、通常のコンソール アプリケーションであるかのように、サービスをデバッグするための非常に優れた方法を提供します。また、サービスをインストール (およびアンインストール) するためのすぐに使える機能を提供することにも言及できます。投稿のパート 2 は、このリンクにあります。

私はこれを自分で数回使用しましたが、本当にお勧めできます。

于 2012-05-08T07:23:47.847 に答える
1

別のクラスでロジックをリファクタリングします。

このクラスを呼び出す単純なコンソール アプリケーションを作成します。

通常のアプリケーションのようにテストします。

スタンドアロンで実行したら、サービスとして実行する必要があります。アクセス許可とサービスの登録に注意してください。いくつかの問題があります (sys ユーザーやデスクトップ セッションなど)。

システム ログを使用することをお勧めします (例: eventvwr で検査できるログ)。

于 2012-05-08T07:20:24.697 に答える
0

VisualStudioから実行中のサービスインスタンスにデバッガーをアタッチできます。メインメニューの[プロセスにアタッチ...]で[デバッグ]をクリックし、リストからサービスプロセスを選択して、[アタッチ]をクリックします。

サービスの起動をデバッグする必要がある場合は、を使用する必要がありますSystem.Diagnostics.Debugger.Break()

于 2012-05-08T07:26:30.263 に答える