Prism のイベント アグリゲーターを使用するアプリケーションで、一部の動作を単体テストしようとしています。単体テストしようとしているコードの 1 つは、UI スレッドでイベントをサブスクライブすることです。EventAggregator の実装を掘り下げてみると、SynchronizationContext.Post
.
この答えは良い回避策かもしれないと思いましたが、より単純な修正を使用することになりました.ユニットテストの開始時に同期コンテキストを明示的に設定します-これは、読み込もうとするまで機能しますSynchronizationContext.Current
私が完全に理解していない行動に私を導きました:
//set the sync context
var thisSyncContext = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(thisSyncContext);
thisSyncContext.Post(cb => {
var ctx = SynchronizationContext.Current; //<-- this is null
var equals = thisSyncContext.Equals(ctx); //<-- this is false
},null);
thisSyncContext.Send(cb => {
var ctx = SynchronizationContext.Current; //<-- this is not null
var equals = thisSyncContext.Equals(ctx); //<-- this is true
}, null);
Post が非同期で発生し、Send が同期で発生することを理解しています。スレッド デバッグ ウィンドウでそれを見ると、非同期呼び出しが行うと予想されるように、実際には別のスレッド ID にキックオーバーします。
私が理解しようとしているのは、同期コンテキストに関数を実行するように指示するとき、同期または非同期に関係なく、そのコンテキストが保持されることを期待していると思います。同期呼び出しでは保持されますが、非同期では保持されません。
この動作が見られるのはなぜですか? また、単体テストでそれをどのように補正できますか?