2

私はさまざまなオープンソース プロジェクトを通じて、人々が同じ問題にさまざまな方法でアプローチする方法を感じ取っています。今回は Event Aggregators で、具体的には Caliburn.Micro のものです。

Rob が、スレッドが提供されない場合、EA は UI スレッドにマーシャリングすると言ったことに気付きました。行は具体的には次のとおりです。

public static Action<System.Action> 
DefaultPublicationThreadMarshaller = action => action();

そしてさらに:

marshal(() =>
         {
           *SNIP*
         });

彼が理解できないのは、これがUIスレッドで呼び出されるとどのように言うことができるかということです。そうでないアクションを指定しない限り、すべてのアクションがUIスレッドで呼び出されますか? (ところで、どのアクションが呼び出されるかを指定できます。上記の行は、アクションが指定されていない場合のみです)。

4

1 に答える 1

1

アクションは、それを呼び出すスレッドで呼び出すことができます。

Action a = () => Foo();
a.Invoke();

または、非同期で呼び出すことができます

Action a = () => Foo();
a.BeginInvoke();

イベント アグリゲーターが同期呼び出しを使用するように構成されている場合、イベントが UI スレッドで処理される可能性があります。ただし、その可能性は非常に低く、通常、イベント アグリゲーターは非同期実行を使用し、アクションはスレッド プールで実行されます。

問題のコードには、アクションで Invoke または BeginInvoke を (内部的に、ここには含まれていませんが) 呼び出す場所があります。ここが違いです。

注: この回答は、特定のイベント アグリゲーターに固有のものではありません。

于 2012-03-27T21:59:44.687 に答える