我有一个简单的视图模型,其中包含一个修改过的ObservableCollection
,它使用SynchronizationContext.Current.Send
对UI线程上的集合执行更改。此集合由长时间运行的后台线程填充。
我在尝试这样做的所有不同方式下工作正常,但是在移动窗口或调整窗口大小时它们似乎都被阻止了。
此图中的间隙来自于在窗口标题栏上按住鼠标按钮。
我尝试过不同的方法
Task.Factory.StartNew:
Task.Factory.StartNew(
() =>
{
double y = 0;
while (true)
{
Values.Add(new ValuePoint(DateTime.Now, Math.Sin(y)));
y += 0.1;
Thread.Sleep(20);
}
});
ThreadPool.QueueUserWorkItem:
ThreadPool.QueueUserWorkItem(GenerateNumbers);
private void GenerateNumbers(object obj)
{
double y = 0;
while (true)
{
Values.Add(new ValuePoint(DateTime.Now, Math.Sin(y)));
y += 0.1;
Thread.Sleep(20);
}
}
新主题:
_valueSimThread = new Thread(GenerateNumbers);
_valueSimThread.IsBackground = true;
_valueSimThread.Start();
我在这里误解了什么吗?我的期望是,在线程中完成的工作不应该受到我在UI线程上所做的事情的影响。是使用SynchronizationContext.Current.Send
更新集合作为问题根源的行动吗?
什么是正确的"模式"有一个由后台任务更新的ObservableCollection
?
答案 0 :(得分:1)
是否使用SynchronizationContext.Current.Send的操作 更新集合我的问题的根源?
是的,确实如此。 SynchronizationContext.Send
将最终将委托发布到您的UI线程。当您移动屏幕时,UI会显示有关窗口新位置,鼠标点击等的许多消息。因此,最终,您需要将工作排队到当前占用的UI线程
只要您使用绑定到UI的某种集合,就没有其他方法可以将工作排入该UI消息循环。