26

私はまだC#、特にC#でのスレッド化に少し慣れていません。シングルスレッドアパートメント(STAThread)を必要とする関数を開始しようとしています

しかし、次のコードをコンパイルすることはできません。

関数は、次のように呼ばれる別のクラスで次のようになりますMyClass

internal static string DoX(string n, string p)
        {
            // does some work here that requires STAThread
        }

関数の上に属性[STAThread]を試しましたが、機能しません。

だから私は次のように新しいスレッドを作成しようとしています:

 Thread t = new Thread(new ThreadStart(MyClass.DoX));

しかし、これはコンパイルされません(最適なオーバーロードされたメソッドには無効な引数エラーがあります)。ただし、オンラインの例は非常に似ています(ここの例)。 何が間違っているのでしょうか。また、新しいSTAスレッドで関数を実行するにはどうすればよいですか。

ありがとう

4

1 に答える 1

48
Thread thread = new Thread(() => MyClass.DoX("abc", "def"));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

値が必要な場合は、それを変数に「キャプチャ」することができますが、変数は他のスレッドが終了するまで値を持たないことに注意してください。

int retVal = 0;
Thread thread = new Thread(() => {
    retVal = MyClass.DoX("abc", "def");
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

またはおそらくもっと簡単です:

Thread thread = new Thread(() => {
    int retVal = MyClass.DoX("abc", "def");
    // do something with retVal
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
于 2012-07-27T05:10:46.550 に答える