为我的API纠正SyncRoot样式

时间:2012-06-22 11:41:52

标签: c# .net multithreading

在我的应用程序中,我有一个类,我希望一次只能访问一个线程的方法。这个类用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类的一面,因为多个线程不可能同时使用这个类中的方法。

思想?

1 个答案:

答案 0 :(得分:1)

锁定公共对象永远不是一个好主意,因为您无法控制此对象(错误)用作锁定对象的位置,可能会导致组件出现死锁。这有效地消除了选项C.

如果在ComClass课程中创建了Service实例,并且永远不会(并且永远不会)在外面提供,则可以安全地锁定comClass成员。因此,如果这是真的,请选择选项B,否则只保留当前的实现。