0

このコードを使用して、スレッドがメイン(UI)スレッドであるかどうかを検出することを考えています。

public static bool IsMainThread()
{
    return Thread.CurrentThread.GetApartmentState() == ApartmentState.STA;
}

確かに、タスクを実行しているワーカースレッドがfalseを返す場合は正常に機能しているように見えますが、一般的にはtrueかどうか疑問に思っています。

関連する場合、これはWPFアプリケーションです。

これは私の他の質問に似ています:コードがメインスレッドで実行されていることをどのように主張しますか?しかし、誰もこの解決策を提案しませんでした。

4

3 に答える 3

1

はい、他のスレッドを作成するときにSTAを設定できます。スレッドプールスレッドはMTAにあります。

于 2012-12-03T16:06:37.560 に答える
1

はい、STAアパートメントに複数のスレッドを含めることができます。ただし、スレッド間でフレームワーク要素を交換してはなりません。それでもエラーが発生します。つまり、テキストボックスコントロールを作成して、STAでもあるワーカースレッドに入力し、メインスレッド(STAでもある)に渡してフォームに追加することはできません。それでもエラーが発生します。それで問題は、なぜ複数のスレッドをSTAに設定したいのかということです。

于 2012-12-03T16:07:09.987 に答える
1

STAThreadAttributeのドキュメントによると、STAであるスレッドを複数持つことはできません(COM相互運用機能を使用していない限り、実際に1つにすることはできません)。

「この属性をエントリポイントメソッド(C#およびVisual BasicのMain()メソッド)に適用します。他のメソッドには影響しません。」

.Net 2.0以降、シングルスレッドアパートメントはCOM相互運用機能を実行する場合にのみ使用することを目的としています。

「COMスレッドモデルは、COM相互運用機能を使用するアプリケーションにのみ関係します。COM相互運用機能を使用しないアプリケーションでこの属性を使用しても効果はありません。」

「.NETFrameworkバージョン2.0では、新しいスレッドは、開始前にアパートメントの状態が設定されていない場合、ApartmentState.MTAとして初期化されます。メインアプリケーションスレッドは、デフォルトでApartmentState.MTAに初期化されます。」

参照: http: //msdn.microsoft.com/en-us/library/system.stathreadattribute (v = vs.100).aspx

于 2012-12-03T20:30:18.997 に答える