在我的c#应用程序中,多个客户端将访问同一个服务器,在写入代码时一次处理一个客户端。在代码中我使用了Moniter类以及队列类。这段代码会影响性能。如果我使用监控类,然后我将从代码中删除队列类。
有时候我的应用程序作为服务运行的远程服务器机器完全停机。下面的代码是后面的代码,因为当我使用命令提示符检查netstatus -an命令时,所有客户端都进入队列客户显示50个连接正在等待...
以下是客户端访问服务器的代码...
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);
}
}
答案 0 :(得分:1)
锁定这个是非常错误的,如果每个线程使用此代码所在的任何类的不同实例,它根本不会工作。它不是从代码片段中清除的如果是这样的话,那就先修好。创建一个单独的对象只是为了存储锁并使其成为静态,或者为它提供与您要保护的共享对象相同的范围(也不清楚)。
你可能仍然遇到麻烦,因为这听起来像是僵局而不是种族。使用调试器很容易解决死锁问题,因为代码卡住了并且根本没有执行。 Debug + Break All,然后是Debug + Windows + Threads。在线程列表中找到工作线程。双击一个以选择它并使用Debug + Call Stack查看它被卡住的位置。重复其他线程。回顾堆栈跟踪以查看其中一个获取锁定并与其他线程进行比较以查看它们阻止的锁定。
如果死锁错综复杂且涉及多个交错锁定,那仍然会很棘手。在这种情况下,日志记真的很难诊断mandelbugs可能需要重写,以减少线程的数量。