web-dev-qa-db-ja.com

C#でのSTAThreadの開始

私はまだ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スレッドで関数を実行させるだけですか?

ありがとう

21
Saher Ahwal
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();
39
Marc Gravell