在我的应用程序中,我有一个类,我希望一次只能访问一个线程的方法。这个类用COM端口上的设备执行一些操作,我不希望一个线程写入端口,而另一个线程写入等。
要使用这个类(不是我维护的),我有一个Service-class,它将COM-using类和服务器实例化为我的应用程序其余部分的API层。虽然我没有直接维护COM类,但我可以编辑它。只是我的一个同事创建了它,我只在其中修复bug。那里有很多低级别的操作,我不想碰。
我将如何强制执行仅限一个线程的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类的一面,因为多个线程不可能同时使用这个类中的方法。
思想?
答案 0 :(得分:1)
锁定公共对象永远不是一个好主意,因为您无法控制此对象(错误)用作锁定对象的位置,可能会导致组件出现死锁。这有效地消除了选项C.
如果在ComClass
课程中创建了Service
实例,并且永远不会(并且永远不会)在外面提供,则可以安全地锁定comClass
成员。因此,如果这是真的,请选择选项B,否则只保留当前的实现。