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);
    }
}

c#中的线程监视器类

锁定这个是非常错误的,如果每个线程都使用这个代码所在的任何类的不同实例,它就根本不起作用。从代码片段中还不清楚是否是这种情况,但先解决它。创建一个单独的对象来存储锁,并使其成为静态对象,或者使其与您试图保护的共享对象具有相同的作用域(也不清楚)。

你可能仍然会遇到麻烦,因为这听起来像是一场僵局,而不是一场比赛。使用调试器很容易解决死锁问题,因为代码被卡住了,根本没有执行。Debug+Break All,然后Debug+Windows+Threads。在线程列表中找到工作线程。双击一个来选择它,然后使用Debug+Call Stack来查看它被卡住的地方。对其他螺纹重复上述步骤。回顾堆栈跟踪,看看其中一个线程在哪里获得了锁,并与其他线程进行比较,看看它们在哪个锁上被阻塞

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