0

BeginSomething()私はとEndSomething()のペアを持つインターフェースを実装しています、そして私の実装はメソッドにありますExecute()

そこで、を作成し、 BeginSomethingとEndSomethingAction action = Executeを呼び出します。ただし、私のExecuteメソッドは、アパートメントの状態がSTA(シングルスレッドアパートメント)であるスレッドによって呼び出される必要があります。通常、これはを呼び出すことによって行われますが、この場合、どのスレッドが自分のメソッドを呼び出すのかわかりません。action.BeginInvokeaction.EndInvokeThread.SetApartmentState

呼び出し元のスレッドをSTAにするにはどうすればよいですか?

4

1 に答える 1

2

クラスがインターフェースに従ってこれらのBegin/Endペアメソッドを実装している場合は、作業が実際にどのように行われるかを制御できます。デリゲート(アクションはの型付きジェネリック)は、私が信じるデフォルトのスレッドプールを使用するため、再利用可能な共有の利用可能なスレッドによって実行されます。スレッドプールをいじることは不可能であるため、この場合、ストレートデリゲートは使用できません。

独自のThreadオブジェクトを作成し(新しいThreadStartをメソッドに渡す)、すでに示したようにそのアパートメントの状態を設定する必要があります。バニラスレッドは私の知識に便利な方法を提供しないので、そのメソッドは単にコールバックする独自の方法を持っている必要があります。

.NET 4.0を使用している場合は、オプションでカスタムStaTaskSchedulerと一緒にタスクを使用することもできますが、多くの依存関係が追加されるため、これは価値があるよりも問題や複雑になる可能性があります。ただし、コールバックの問題は解消されます。

于 2011-04-13T04:49:47.427 に答える