在下面的代码中TimerRecalcStatisticsElapsed
应该只运行一个实例。此回调调用的工作方法按顺序运行,一次最多运行一个线程。
问题第 1 部分:
如果计时器的回调运行一个线程池线程(而不是在单独的线程上运行回调),那么说线程池可能会排队并推迟线程以供以后执行基于条件(达到 MaxThreads,线程池内部逻辑)是否正确?
问题第 2 部分:
假设一个计时器回调可以排队等待除立即执行之外的任何事情,这是否意味着任意数量的线程回调可以同时执行?
问题第 3 部分
假设第 2 部分为真,这是否意味着下面的代码可以同时运行多个回调?
我问的原因是因为有数千个此类的实例在多 CPU 服务器上运行。我还看到数据损坏与// Do Work Here
.
在旁边
// Do work here
在内部使用 System.Collections.Dictionary 并编辑 y 的值。它还为串行调用的后续函数删除了一些键。该函数缺少以前在第一次调用中存在的键 (x)。我认为这是因为最终陈述存在竞争条件obj.cleanupdata()
public class SystemTimerTest
{
readonly System.Timers.Timer timerRecalcStatistics;
readonly System.Diagnostics.Stopwatch stopwatchForRecalcStatistics = new System.Diagnostics.Stopwatch();
public SystemTimerTest(TimeSpan range, DataOverwriteAction action)
{
int recalculateStatisticsEveryXMillseconds = 1000;
timerRecalcStatistics = new System.Timers.Timer(recalculateStatisticsEveryXMillseconds);
timerRecalcStatistics.AutoReset = true;
timerRecalcStatistics.Elapsed += new System.Timers.ElapsedEventHandler(TimerRecalcStatisticsElapsed);
timerRecalcStatistics.Interval = recalculateStatisticsEveryXMillseconds;
timerRecalcStatistics.Enabled = true;
this.maxRange = range;
this.hashRunningTotalDB = new HashRunningTotalDB(action);
this.hashesByDate = new HashesByDate(action);
this.dataOverwriteAction = action;
}
private void TimerRecalcStatisticsElapsed(object source, System.Timers.ElapsedEventArgs e)
{
stopwatchForRecalcStatistics.Start();
Console.WriteLine("The TimerRecalcStatisticsElapsed event was raised at {0}", e.SignalTime.ToString("o"));
// DO WORK HERE
stopwatchForRecalcStatistics.Stop();
double timeBuffer = GetInterval(IntervalTypeEnum.NearestSecond, e.SignalTime) - stopwatchForRecalcStatistics.ElapsedMilliseconds;
if (timeBuffer > 0)
timerRecalcStatistics.Interval = timeBuffer;
else
timerRecalcStatistics.Interval = 1;
stopwatchForRecalcStatistics.Reset();
timerRecalcStatistics.Enabled = true;
}
}