WPFViewModelの次のコードを検討してください。
protected void Init()
{
Debug.WriteLine(string.Format("ChangeManager init on thread={0}", Thread.CurrentThread.ManagedThreadId));
var uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
this.modelChanged = (o, args) => Task.Factory.StartNew(() =>
{
Debug.WriteLine(string.Format("ModelChanged on thread={0}", Thread.CurrentThread.ManagedThreadId));
this.ModelChanged(o, args);
},
CancellationToken.None,
TaskCreationOptions.None,
uiTaskScheduler);
}
...ここで、modelChangedは、オブジェクトモデルの変更に応答するためのイベントハンドラーです。このコードはUIスレッドで実行され、発生元のスレッドに関係なく、UIスレッドでイベントが処理されることを期待して設計されています。
ただし、これを実行すると、出力は次のようになります。
ChangeManager init on thread=1
ModelChanged on thread=3
ModelChanged on thread=3
ModelChanged on thread=7
ModelChanged on thread=9
私の期待は、スレッド1がすべての処理が行われる場所になることです。このようにSynchronizationContextを直接使用しようとしても:
protected void Init()
{
Debug.WriteLine(string.Format("ChangeManager init on thread={0}", Thread.CurrentThread.ManagedThreadId));
this.uiContext = SynchronizationContext.Current;
modelChanged = (o, args) => uiContext.Post((ignore) => {
Debug.WriteLine(string.Format("ModelChanged on thread={0}", Thread.CurrentThread.ManagedThreadId));
this.ModelChanged(o, args);
}
, null);
}
...同じことがわかります。
私の考え方やアプローチに何か問題がありますか?initスレッドでイベントを処理するにはどうすればよいですか?
前もって感謝します!