我有一个套接字,用于与执行不同任务的多个线程的控制器进行通信。目前,我仔细构建了对套接字的访问,以确保在同一个线程中不会多次锁定,因此我不会以死锁结束。如果可能,我想删除此限制。我发现使用.net 4.5和更新版本我可以使用Monitor类的IsEntered方法,但是如何在早期的框架上执行此操作?主要是.net 3.5CF,它没有IsEntered方法。我需要锁来保持单个线程不会占用访问套接字。我在下面的课程中通过在外部锁上放置一个外部锁来保护对插座的访问来实现这一目的。
public class SyncLock
{
private object inner, outer;
public SyncLock()
{
inner = new object();
outer = new object();
}
public void Enter()
{
if (Monitor.IsEntered(inner))
{
Monitor.Enter(inner);
}
else
{
lock (outer)
{
Monitor.Enter(inner);
}
}
}
public void Exit()
{
Monitor.Exit(inner);
}
}
要使用此类,我使用以下锁定代码创建SyncLock类的共享实例。
SyncLock syncLock = new SyncLock();
...
syncLock.Enter();
try
{
...
}
finally
{
syncLock.Exit();
}