0

私のアプリケーションには、一度に1つのスレッドだけがメソッドにアクセスしたいクラスがあります。このクラスは、COMポート上のデバイスでいくつかの操作を実行し、一方のスレッドがポートに書き込み、もう一方のスレッドが書き込みを行っているなどのことを望まない。

このクラス(私は管理していません)を使用するために、COMを使用するクラスとサーバーをAPIレイヤーとしてアプリケーションの残りの部分にインスタンス化するServiceクラスがあります。COMクラスは私が直接管理しているわけではありませんが、編集することはできます。同僚が作成しただけで、バグ修正のみを行っています。そこには、触れたくない低レベルのビット操作がたくさんあります。

COMクラスへの1スレッドのみのアクセスを強制するにはどうすればよいですか。

オプション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 に答える