我有一个计数器,它记录当前处理的大型报告数。
“reportOrderNextInQueue”变量从数据库中获取报告订单,并检查报告订单是否为“Normal”或“Large”(这是通过定义reportOrderNextInQueue变量的bool IsProcessing属性实现的)。在处理大型报告时,系统会Interlock增加processedLargeReport int并处理大型报告。一旦大型报告被处理,系统会Interlock减少该值。
整个想法是只允许同时处理一个报告,因此一旦一个线程正在处理大型报告,则其他线程不应能够访问数据库中的大型报告。bool allowLargeReport变量检查processedLargeReports int是否超过限制。
我很好奇这是否是正确的实现方式,因为在周一之前我无法进行测试。我不确定是否必须使用InterLocked类还是只需将processedLargeReports变量定义为volatile成员。
private int processedLargeReports;
我正在生成和启动五个线程,其中每个线程都会访问这个方法:
public bool GenerateReport(EstimatedReportSize reportSize)
{
var currentDateTime = DateTimeFactory.Instance.DateTimeNow;
bool allowLargeReports = (this.processedLargeReports < Settings.Default.LargeReportLimit);
var reportOrderNextInQueue = this.ReportOrderLogic.GetNextReportOrderAndLock(
currentDateTime.AddHours(
this.timeoutValueInHoursBeforeReleaseLock),
reportSize,
CorrelationIdForPickingReport,
allowLargeReports);
if (reportOrderNextInQueue.IsProcessing)
{
Interlocked.Increment(ref this.processedLargeReports);
}
var currentReport = this.GetReportToBeWorked(reportOrderNextInQueue);
var works = this.WorkTheReport(reportOrderNextInQueue, currentReport, currentDateTime);
if (reportOrderNextInQueue.IsProcessing)
{
Interlocked.Decrement(ref this.processedLargeReports);
}
return works;
}
“reportOrderNextInQueue”变量从数据库中获取报告订单,并检查报告订单是否为“Normal”或“Large”(这是通过定义reportOrderNextInQueue变量的bool IsProcessing属性实现的)。在处理大型报告时,系统会Interlock增加processedLargeReport int并处理大型报告。一旦大型报告被处理,系统会Interlock减少该值。
整个想法是只允许同时处理一个报告,因此一旦一个线程正在处理大型报告,则其他线程不应能够访问数据库中的大型报告。bool allowLargeReport变量检查processedLargeReports int是否超过限制。
我很好奇这是否是正确的实现方式,因为在周一之前我无法进行测试。我不确定是否必须使用InterLocked类还是只需将processedLargeReports变量定义为volatile成员。