c#中的线程监视器类
本文关键字:监视器 线程 | 更新日期: 2023-09-27 18:29:26
在我的c#应用程序中,多个客户端将访问同一台服务器,每次处理一个客户端的数据。在代码中,我使用了Moniter类和队列类。这段代码会影响性能吗?如果我使用Monitor类,那么我应该从代码中删除队列类吗。
有时,我的应用程序作为服务运行的远程服务器机器完全关闭。下面的代码是原因,因为所有客户端都在一个队列中,当我使用命令提示符检查netstatus时,对于8个客户端,它显示50个连接在Time wait中。。。
下面是我的代码,客户端访问服务器。。。
if (Id == "")
{
System.Threading.Monitor.Enter(this);
try
{
if (Request.AcceptTypes == null)
{
queue.Enqueue(Request.QueryString["sessionid"].Value);
string que = "";
que = queue.Dequeue();
TypeController.session_id = que;
langStr = SessionDatabase.Language;
filter = new AllThingzFilter(SessionDatabase, parameters, langStr);
TypeController.session_id = "";
filter.Execute();
Request.Clear();
return filter.XML;
}
else
{
TypeController.session_id = "";
filter = new AllThingzFilter(SessionDatabase, parameters, langStr);
filter.Execute();
}
}
finally
{
System.Threading.Monitor.Exit(this);
}
}
锁定这个是非常错误的,如果每个线程都使用这个代码所在的任何类的不同实例,它就根本不起作用。从代码片段中还不清楚是否是这种情况,但先解决它。创建一个单独的对象来存储锁,并使其成为静态对象,或者使其与您试图保护的共享对象具有相同的作用域(也不清楚)。
你可能仍然会遇到麻烦,因为这听起来像是一场僵局,而不是一场比赛。使用调试器很容易解决死锁问题,因为代码被卡住了,根本没有执行。Debug+Break All,然后Debug+Windows+Threads。在线程列表中找到工作线程。双击一个来选择它,然后使用Debug+Call Stack来查看它被卡住的地方。对其他螺纹重复上述步骤。回顾堆栈跟踪,看看其中一个线程在哪里获得了锁,并与其他线程进行比较,看看它们在哪个锁上被阻塞
如果死锁很复杂并且涉及多个交错锁,那么这可能仍然很棘手。在这种情况下,日志记录可能会有所帮助。真正难以诊断的mandelbugs可能需要重写以减少线程数量。