我有一个启动计时器功能的 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 的好用例吗?如果我这样做,核心类中的所有方法也必须是异步的吗?
使用 Parallel.ForEach 之类的东西会更好吗?