【发布时间】:2015-05-05 14:39:09
【问题描述】:
我有一个简单的视图模型,其中包含修改后的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 的正确“模式”是什么?
【问题讨论】:
标签: c# multithreading mvvm observablecollection ui-thread