1

我正在尝试Shape在画布上的背景线程中创建包含 5000 个对象的绘图。
我使用异步等待模式:

async void CreateDrawingAsync()
{
    await Task.Run(() => CreateDrawing()).ConfigureAwait(false);
}
void CreateDrawing()
{
    DrawObjects = new ObservableCollectionEx<DrawObject>();
    // or: DrawObjects.Clear();
    RaisePropertyChanged("DrawObjects");
    // etc ... etc ...
}

ObservableCollectionEx意味着我使用扩展ObservableCollection通过 Dispatcher 将对象添加到集合中。
当我从CreateDrawingAsyncWindow 的 Loaded 事件(在 ctor 中Data)开始时,UI 没有响应。
使用 DispatcherPriority.Background 项目在 UI 中被一一添加,但在这种情况下,UI 也没有响应。

Loaded += (object sender, RoutedEventArgs e) =>
{
     DataContext = new Data(2000, 1000, 1000);
};

1) 我希望后台线程可以解决无响应的 UI 问题,我忽略了什么?

2)为什么RaisePropertyChanged("DrawObjects")(见上面的代码)没有效果?我本来希望由于属性更改,绘图会被清除。

4

1 回答 1

2

您不应该在后台线程上执行 UI 操作。这包括:

  • 在画布上绘图。
  • 提高PropertyChanged通知。
  • 创建或更新ObservableCollection.

创建像ObservableCollectionEx这样的假 UI 组件只是将其所有工作转发到 UI 线程并不会为您带来任何好处。

于 2014-03-14T15:23:47.563 回答