c#中的线程监视器类#
问题描述:
在我的c#应用程序中,多个客户端将访问同一个服务器,以便在代码写入的同时处理一个客户端。在代码中,我使用了Moniter类以及队列类。此代码影响performance.if我使用Monitor类,那么我应该从代码中删除队列类。c#中的线程监视器类#
有时我的远程服务器机器,我的应用程序作为服务运行时是完全down.is下面的代码是reasond背后,所有客户端进入队列,当我检查netstatus -an命令使用命令提示符8个客户它表明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);
}
}
答
锁定这是非常错误的,它不会如果每个线程都使用这个代码所在的任何类的不同实例,那么就可以工作。它不是'如果出现这种情况,请从代码片段中清除,但先解决。创建一个单独的对象只是为了存储锁定并将其设置为静态,或者将其与您要保护的共享对象(也不清楚)的范围相同。
您可能仍然有麻烦,因为这听起来像是僵局而不是种族。死锁很容易与调试器进行故障诊断,因为代码被卡住并且根本没有执行。调试+打破所有,然后调试+ Windows +线程。找到线程列表中的工作线程。双击一个选择它并使用调试+调用堆栈来查看它卡住的位置。重复其他线程。通过堆栈跟踪回顾一下,看看其中一个人获得了一个锁,并与其他线程比较,看看他们锁定了哪个锁。
如果死锁错综复杂并涉及多个交错锁,那仍然会很棘手。在这种情况下,日志可能会有帮助真的很难诊断mandelbugs可能需要重写,以减少线程数量。
你的队列是什么类型?不建议锁定(请参阅:http://www.albahari.com/threading/part2.aspx#_Locking) – weismat 2012-03-29 08:38:50
我像这样定义了我的队列....队列队列=新队列(); –
user703526
2012-03-29 09:11:45
为什么不使用'lock(this){...}',它比'Monitor.Enter(this)短;尝试{...}终于{Monitor.Exit(this); }'。 – 2012-03-29 09:41:47