タイマーで機能を開始する 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 のようなものを使用したほうがよいでしょうか?