作为 Web 应用程序的一部分,我在 IIS 上有一个单例服务类(出于数据缓存原因,该服务是单例)。向服务发出请求的浏览器客户端可能会产生以下三种结果之一:
1)缓存中有数据并且数据没有过期(过时)——我们返回这个数据。非常快。2)缓存的数据过期了,但是另一个请求已经在查询数据库了。我们返回了缓存的数据。3)缓存数据过期,没有请求对数据库进行查询。该请求向前移动以进行查询。
但是,针对同名存储过程的数据库查询必须排队(要求)。
因此,我编写了这个队列类,旨在将这些查询排队并连续运行它们,而不是同时运行。这些队列类根据需要创建并存储在单例类的列表中。当请求移动到第 (3) 部分时,它会找到与其存储过程名称匹配的队列类,并将请求提交给队列类。然后它一直等到数据从数据库返回,以便它可以为 HTML 请求提供服务。
不幸的是,在使用此代码几个小时后,服务器进程的最大值为 100%。
我不确定改进它的最佳方法是什么,因为多线程编码不是我的专长。
队列类代码如下所示:
public ReportTable GetReportTable(ReportQuery query)
{
lock (_queue)
{
_queue.Enqueue(query);
Monitor.Pulse(_queue);
}
lock (_queue)
{
var firstQueryInQueue = _queue.Peek();
while (_inUse || firstQueryInQueue == null || firstQueryInQueue.GetHashCode() != query.GetHashCode())
{
Monitor.Pulse(_queue);
Monitor.Wait(_queue);
}
_inUse = true;
firstQueryInQueue = _queue.Dequeue();
var table = firstQueryInQueue.GetNewReportTable();
_inUse = false;
Monitor.Pulse(_queue);
return table;
}
}