4

タイマーで機能を開始する Windows サービスがあります。この関数は、データベースに新しいレコードを照会し、見つかった新しいレコードごとに Web サービスを呼び出します。

このサービスは、各間隔で複数のデータベースに対してこれを行う必要があります。

現在、サービスは次のようになっています。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ServiceProcess;

namespace MiManager.TicketLogger {

  public partial class TicketLogger : ServiceBase {

    private TicketLoggerSettings _settings;
    private List<DbConnectionSettings> _connections;

    public TicketLogger() {
      InitializeComponent();
    }

    protected override void OnStart(string[] args) {

      var helpers = new MiManager.TicketLogger.Helpers();
      _settings = helpers.GetTicketLoggerSettings();
      _connections = helpers.GetDbConnectionSettings();

      if (_settings.LogVerbose == true) evlgTicketLogger.WriteEntry("Registry entries obtained", EventLogEntryType.Information, 100);
      tmrTicketLogger.Interval = _settings.ServiceInterval;
      tmrTicketLogger.Elapsed += new System.Timers.ElapsedEventHandler(TimerElapsed);
      tmrTicketLogger.Enabled = true;
      tmrTicketLogger.Start();
    }

    protected override void OnStop() {
      tmrTicketLogger.Stop();
      tmrTicketLogger.Enabled = false;
    }

    private void TimerElapsed(Object sender, System.Timers.ElapsedEventArgs e) {
      try {
        tmrTicketLogger.Stop();

        Core core = new MiManager.TicketLogger.Core();
        List<Message> messages = core.LogTickets(_settings);
        foreach (var message in messages) {
          evlgTicketLogger.WriteEntry(message.Text, message.EntryType, message.ErrorCode);
        }
        if (_settings.LogVerbose == true) {
          evlgTicketLogger.WriteEntry("Ticket logging complete", EventLogEntryType.Information, 101);
        }
      }
      catch (Exception ex) {
        evlgTicketLogger.WriteEntry(ex.ToString(), EventLogEntryType.Error, 400);
      }
      finally {
        tmrTicketLogger.Start();
      }
    }

  }

}

ここで、サービスを調整して複数の接続文字列を取得し、各データベース接続の TimerElapsed 関数で LogTickets 関数を呼び出す必要があります。

Windows サービスでこれを行うために現在推奨されている方法は何ですか?

何年も前の以前のプロジェクトでは、処理したい接続ごとに手動で新しいスレッドを作成しましたが、今はもっと良い方法があると確信していますか?

Async/Await の適切な使用例ですか? その場合、Core クラスのすべてのメソッドも非同期にする必要がありますか?

Parallel.ForEach のようなものを使用したほうがよいでしょうか?

4

2 に答える 2