System.Threading.Timer будет использовать поток из пула потоков для запуска обработчика Elapsed. Итак, вы уже используете многопоточность, просто используя таймер. На самом деле, все таймеры используют какой-то фоновый поток; они просто различаются по тому, как они многопоточны, чтобы делать то, что наиболее целесообразно для предполагаемого использования.
Если вам нужно что-то запускать раз в десять минут, но также убедитесь, что два обработчика никогда не запускаются одновременно, попробуйте установить флаг «В настоящее время» в методе Elapsed и проверить его перед выполнением любых тяжелых работ.
protected override void OnStart(string[] args)
{
var aTimer = new Timer(600000);
aTimer.Elapsed += ATimerElapsed;
aTimer.Interval = 600000;
aTimer.Enabled = true;
GC.KeepAlive(aTimer);
}
private static currentlyRunning;
private static void ATimerElapsed(object sender, ElapsedEventArgs e)
{
if(currentlyRunning) return;
currentlyRunning = true;
try
{
Worker.ProcessScheduledAudits();
}
catch (Exception ex)
{
EventLog.WriteEntry("Application", ex.Message, EventLogEntryType.Error);
}
currentlyRunning = false;
}
Теоретически, это может привести к гонке, но так как вы только начинаете с этого события каждые 10 минут, шансы ЧРЕЗВЫЧАЙНО маловероятны.