在我的应用程序中,我有一个类,我希望每次只有一个线程访问它的方法。这个类对COM端口上的设备执行一些操作,我不希望一个线程写端口,而另一个线程在写,等等。
为了使用这个类(不是由我维护的),我有一个服务类,它实例化COM使用类和服务器作为应用程序其余部分的API层。虽然COM类不是由我直接维护的,但我可以编辑它。只是我的一个同事创建了它,而我只在其中修复错误。这里有很多低级的位操作,我不想去碰它们。
我该如何强制单线程只访问COM类呢?
选项A(我目前已经实现):
class Service
{
private ComClass comClass;
private readonly object syncRoot = new object();
public void DoThisWithCom()
{
lock(syncRoot)
{
comClass.DoSomething();
}
}
}选项B:
class Service
{
private ComClass comClass;
public void DoThisWithCom()
{
lock(comClass)
{
comClass.DoSomething();
}
}
}选项C(这是可能的,因为我可以编辑COM类的代码):
class Service
{
private ComClass comClass;
public void DoThisWithCom()
{
lock(comClass.SyncRoot)
{
comClass.DoSomething();
}
}
}也许把所有这些放在COM类方面会更好,因为多线程不可能同时使用这个类中的方法。
有什么想法?
发布于 2012-06-22 20:17:44
锁定公共对象从来都不是一个好主意,因为您无法控制此对象在其他地方(错误地)用作锁定对象,这可能会导致组件中的死锁。这有效地消除了选项C。
如果ComClass实例是在Service类中创建的,并且从未(也永远不会)对外部可用,那么锁定您的comClass成员是安全的。因此,如果这是真的,就选择选项B,否则就保留当前的实现。
https://stackoverflow.com/questions/11155508
复制相似问题