【问题标题】:WPF loading Frame asyncWPF加载帧异步
【发布时间】:2015-07-16 05:35:13
【问题描述】:

我有一个TabConrol,当用户执行某些操作时,会以编程方式添加一个新的TabItem。在此选项卡中,有一个 Frame 将包含所需的 Page.XAML。这一切都像这样完美地工作;

private void addNewTab()
{
   TabItem tab = new TabItem();
   Grid g = new Grid();
   Frame f = newFrame();
   g.Children.Add(f);
   tab.Content = g;
   MyTabControl.Items.Add(tab);
   MyTabControl.SelectedItem = tab;
}

private Frame newFrame()
{
   Frame f = new Frame();
   //Full logic for Frame removed
   f.Navigate(new MyPage());
   return f;
}

问题是有时加载新的Frame 可能需要一些时间。所以我想做这个异步。所以当它加载时可能会有一个加载动画。我认为这会起作用;

private async void addNewTab()
{
   TabItem tab = new TabItem();
   Grid g = new Grid();

   var test = Task<Frame>.Factory.StartNew(() => newFrame(selectTab, value));
   await test;
   f = test.Result;

   g.Children.Add(f);
   tab.Content = g;
   MyTabControl.Items.Add(tab);
   MyTabControl.SelectedItem = tab;
}

private Frame newFrame()
{
   Frame f = new Frame();
   //Full logic for Frame removed
   f.Navigate(new MyPage());
   return f;
}

问题是它在运行时在newFrame() 中的Frame f = new Frame(); 上返回跟随错误;

“System.InvalidOperationException”类型的异常发生在 PresentationCore.dll 但未在用户代码中处理

附加信息:调用线程必须是STA,因为很多 UI 组件需要这个。

开始认为我试图以错误的方式解决这个问题。处理这个问题的最佳方法是什么?

【问题讨论】:

标签: c# wpf async-await


【解决方案1】:

构建任何合理的 UI 都是一项极其快速的操作。但是,确定要在该 UI 中显示的 数据 可能需要任何时间。所以我认为这实际上是缓慢的。

您不能在后台线程上构建实际的 UI 组件;这就是异常告诉你的。

但您可以在后台线程上构建数据,然后稍后将其加载到 UI 中:

private async Task addNewTabAsync()
{
  TabItem tab = new TabItem();
  Grid g = new Grid();

  var data = await Task.Run(() => getData(value));
  Frame f = new Frame();
  // Fill out frame with data.
  f.Navigate(new MyPage());

  g.Children.Add(f);
  tab.Content = g;
  MyTabControl.Items.Add(tab);
  MyTabControl.SelectedItem = tab;
}

请注意,我将async void 更改为async Task(并添加了Async 后缀),并将StartNew 更改为Run 以遵循最佳做法。

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 2011-07-12
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多