2012-03-29 98 views
0

在我的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); 
    } 
} 
+0

你的队列是什么类型?不建议锁定(请参阅:http://www.albahari.com/threading/part2.aspx#_Locking) – weismat 2012-03-29 08:38:50

+0

我像这样定义了我的队列....队列队列=新队列(); – user703526 2012-03-29 09:11:45

+0

为什么不使用'lock(this){...}',它比'Monitor.Enter(this)短;尝试{...}终于{Monitor.Exit(this); }'。 – 2012-03-29 09:41:47

回答

1

锁定是非常错误的,它不会如果每个线程都使用这个代码所在的任何类的不同实例,那么就可以工作。它不是'如果出现这种情况,请从代码片段中清除,但先解决。创建一个单独的对象只是为了存储锁定并将其设置为静态,或者将其与您要保护的共享对象(也不清楚)的范围相同。

您可能仍然有麻烦,因为这听起来像是僵局而不是种族。死锁很容易与调试器进行故障诊断,因为代码被卡住并且根本没有执行。调试+打破所有,然后调试+ Windows +线程。找到线程列表中的工作线程。双击一个选择它并使用调试+调用堆栈来查看它卡住的位置。重复其他线程。通过堆栈跟踪回顾一下,看看其中一个人获得了一个锁,并与其他线程比较,看看他们锁定了哪个锁。

如果死锁错综复杂并涉及多个交错锁,那仍然会很棘手。在这种情况下,日志可能会有帮助真的很难诊断mandelbugs可能需要重写,以减少线程数量。