gpt4 book ai didi

c# - FIFO 队列导致 IIS 处理器达到 100% 的最大值

转载 作者:行者123 更新时间:2023-11-30 18:36:02 27 4
gpt4 key购买 nike

作为 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;
}
}

最佳答案

我不知道我是否理解问题但你可以非常简单地重写它

private object _lockObj=new object();
public ReportTable GetReportTable(ReportQuery query)
{
lock(_lockObj){
var table = query.GetNewReportTable();
return table;
}
}

关于c# - FIFO 队列导致 IIS 处理器达到 100% 的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14260789/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com