考虑 WPF ViewModel 的以下代码:
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 线程上处理要处理的事件?
提前致谢!