0

関数を持つクラスをC#で書いています

Print(string s)

前回のバージョンでは、この関数が多くのスレッドから呼び出され、この関数が呼び出されるたびにロックする必要があることがわかりました。C言語では、この関数の名前を次のように変更できます

PrintA(string s) 

ヘッダーファイルを次のようなものに変更します

#define Print(a) {Lock(PrintA) //
                  { //
                      PrintA(a) //
                  } //
                 } 

このようなものをC#で書くことは可能ですか?コード全体で複数の場所ではなく、1つの場所を変更したいだけです。

4

2 に答える 2

1

C#にはマクロはありません。メソッドに同期を追加するには、次を使用できます。

void Print(string s)
{
    lock (lockObject) { PrintA(s); }
}

ロックオブジェクトを定義する必要があります。クラスにフィールドを追加するだけです。

private readonly object lockObject = new object();

またはあなたが使用することができます

[MethodImpl(MethodImplOptions.Synchronized)]
void Print(string s) { ... }

これはlock(this)、メソッドに追加するのと同じです。ロックオブジェクトはプライベートであり、自分だけがロックできるため、前者の方が適しています。

于 2012-04-22T08:45:34.670 に答える
0

[MethodImpl(MethodImplOptions.Synchronized)]1つのメソッド全体をロックする場合は、次の属性で装飾できます。

[MethodImpl(MethodImplOptions.Synchronized)]
public void Print(string s)
{
    ...
}

より具体的な制御についてlockは、コードブロックで使用する必要があります。

于 2012-04-22T08:44:52.143 に答える