首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的接口的正确SyncRoot样式

我的接口的正确SyncRoot样式
EN

Stack Overflow用户
提问于 2012-06-22 19:41:52
回答 1查看 65关注 0票数 0

在我的应用程序中,我有一个类,我希望每次只有一个线程访问它的方法。这个类对COM端口上的设备执行一些操作,我不希望一个线程写端口,而另一个线程在写,等等。

为了使用这个类(不是由我维护的),我有一个服务类,它实例化COM使用类和服务器作为应用程序其余部分的API层。虽然COM类不是由我直接维护的,但我可以编辑它。只是我的一个同事创建了它,而我只在其中修复错误。这里有很多低级的位操作,我不想去碰它们。

我该如何强制单线程只访问COM类呢?

选项A(我目前已经实现):

代码语言:javascript
复制
class Service
{
    private ComClass comClass;

    private readonly object syncRoot = new object();

    public void DoThisWithCom()
    {
       lock(syncRoot)
       {
         comClass.DoSomething();
       }
    }
}

选项B:

代码语言:javascript
复制
class Service
{
    private ComClass comClass;

    public void DoThisWithCom()
    {
       lock(comClass)
       {
         comClass.DoSomething();
       }
    }
}

选项C(这是可能的,因为我可以编辑COM类的代码):

代码语言:javascript
复制
class Service
{
    private ComClass comClass;

    public void DoThisWithCom()
    {
       lock(comClass.SyncRoot)
       {
         comClass.DoSomething();
       }
    }
}

也许把所有这些放在COM类方面会更好,因为多线程不可能同时使用这个类中的方法。

有什么想法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-22 20:17:44

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11155508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档