C# WCF服务中监视器类的同步问题

C# WCF服务中监视器类的同步问题,c#,wcf,timeout,monitor,self-hosting,C#,Wcf,Timeout,Monitor,Self Hosting,我有一个自托管的WCF服务,我遇到了以下问题:在创建服务实例15分钟后,operation contract方法中的TryEnter调用不断返回false,但Main函数中的TryEnter调用(也通过Monitor类使用同步)返回true 以下是我的应用程序和错误的描述: 我正在WindowsXPSP2中的VisualStudio2008(C#)中开发一个自托管WCF服务。 主机的ServiceHost实例是在主函数的开头创建的。主函数运行while(true)循环,在此期间执行定期读取、写入

我有一个自托管的WCF服务,我遇到了以下问题:在创建服务实例15分钟后,operation contract方法中的TryEnter调用不断返回false,但Main函数中的TryEnter调用(也通过Monitor类使用同步)返回true

以下是我的应用程序和错误的描述: 我正在WindowsXPSP2中的VisualStudio2008(C#)中开发一个自托管WCF服务。 主机的ServiceHost实例是在主函数的开头创建的。主函数运行while(true)循环,在此期间执行定期读取、写入、维护等操作。 有一个静态对象集合(可以随时间添加或删除),充当工作线程的容器。其中一些线程执行Main函数请求的定期工作,而另一些线程则执行对远程设备的按需读写。使用监视器类(TryEnter和Exit方法)对这些对象执行同步锁定。这些对象也可以通过使用相同函数的服务契约方法(服务)进行访问。在主功能和服务方法之间进行同步。创建服务实例时,它会以设计的性能运行15分钟,之后从服务发出的每个TryEnter(obj,timeout)调用在指定的超时过期后返回false。但是,这并不影响在Main函数中进行的TryEnter调用,即它们总是返回true。 我已尝试更改InstanceContextMode、ConcurrencyMode和服务限制属性的设置 maxConcurrentCalls=“1”;maxConcurrentSessions=“5” 每种配置都会产生相同的效果。当我重新启动主机应用程序时,服务会再次响应,但当我在应用程序运行时强制关闭并重新打开主机时(服务实例仍保留在内存中)服务不会响应。 这不是服务不可用的情况,因为调用从未到达服务实例。调用该方法后,它的执行将转到TryEnter调用,该调用位于该方法的关键部分之前,TryEnter仅在超时(15秒)后返回false。 我已经检查并再次检查了TryEnter和Exit的配对–这些方法总是在关键部分结束时释放锁。 即使在15分钟期限结束后,不使用锁定或相关对象的其他合同操作也可以正常工作

提前谢谢大家。
节日快乐

Monitor
是可重入的,因此听起来您的
Main
方法的线程无法释放锁。因此,当它请求锁(
TryEnter
)时,它会得到锁(将计数器增加一个)

所有其他线程都将被拒绝。您将需要调试锁的获取和持有位置

我已经检查并再次检查了TryEnter和Exit的配对–这些方法总是在关键部分结束时释放锁

对不起,但我想你要付三倍的支票。特别是,与
lock
不同,
TryEnter
不会有任何特殊的异常处理。您的代码应该如下所示:

if(Monitor.TryEnter(lockObj, timeout)) {
    try {
        ...
    } finally {
        Monitor.Exit(lockObj);
    }
}
另外-确保您从不在代码中重新设计您的
lockObj
,因为这不会解锁正确的对象

(或使用标志进行类似操作,尤其是在.NET 4.0中,对于
输入
等)