移动/调整窗口大小

时间:2015-05-05 14:39:10

标签: c# multithreading mvvm observablecollection ui-thread

我有一个简单的视图模型,其中包含一个修改过的ObservableCollection,它使用SynchronizationContext.Current.Send对UI线程上的集合执行更改。此集合由长时间运行的后台线程填充。

我在尝试这样做的所有不同方式下工作正常,但是在移动窗口或调整窗口大小时它们似乎都被阻止了。

enter image description here 此图中的间隙来自于在窗口标题栏上按住鼠标按钮。

我尝试过不同的方法

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

1 个答案:

答案 0 :(得分:1)

  

是否使用SynchronizationContext.Current.Send的操作   更新集合我的问题的根源?

是的,确实如此。 SynchronizationContext.Send将最终将委托发布到您的UI线程。当您移动屏幕时,UI会显示有关窗口新位置,鼠标点击等的许多消息。因此,最终,您需要将工作排队到当前占用的UI线程

只要您使用绑定到UI的某种集合,就没有其他方法可以将工作排入该UI消息循环。