【问题标题】:Task blocked when moving / resizing window移动/调整窗口大小时任务被阻止
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多