0

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

想法?

4

1 回答 1

1

锁定公共对象绝不是一个好主意,因为您无法控制该对象在其他地方被(误)用作锁定对象,这可能会导致组件中的死锁。这有效地消除了选项 C。

如果该ComClass实例是在您的Service类中创建的,并且永远不会(也永远不会)可供外部使用,那么锁定您的comClass成员是安全的。因此,如果这是真的,请选择选项 B,否则只需保留当前的实现。

于 2012-06-22T12:17:43.557 回答