我有一个Windows服务,它按照计时器的设定启动一个函数。该函数查询数据库以获取新记录,并为每个找到的新记录调用Web服务。
现在有一个要求,即该服务需要在每个时间间隔内为多个数据库执行此操作。
该服务当前的形式如下:
现在我需要调整服务以获取多个连接字符串,并在TimerElapsed函数中为每个db连接调用LogTickets函数。
在Windows服务中,目前推荐的做法是什么?
在以前的一个项目中,很多年前,我为每个要处理的连接手动创建了一个新线程,但我相信现在有更好的方法吧?
这是Async/Await的一个好用例吗?如果我这样做,Core类中的所有方法是否都必须是异步的?
使用类似Parallel.ForEach这样的东西会更好吗?
现在有一个要求,即该服务需要在每个时间间隔内为多个数据库执行此操作。
该服务当前的形式如下:
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函数中为每个db连接调用LogTickets函数。
在Windows服务中,目前推荐的做法是什么?
在以前的一个项目中,很多年前,我为每个要处理的连接手动创建了一个新线程,但我相信现在有更好的方法吧?
这是Async/Await的一个好用例吗?如果我这样做,Core类中的所有方法是否都必须是异步的?
使用类似Parallel.ForEach这样的东西会更好吗?
_connections
,或者记录是如何被获取的。 - Dustin Kingen