考慮下面的代碼爲WPF ViewModel的執行:獲得一個的TaskScheduler /的SynchronizationContext對特定線程
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線程上處理的事件?
在此先感謝!