Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加载帧异步_C#_Wpf_Async Await - Fatal编程技术网

C# 加载帧异步

C# 加载帧异步,c#,wpf,async-await,C#,Wpf,Async Await,我有一个TabConrol,当用户做某些事情时,会以编程方式添加一个新的TabItem。此选项卡中有一个框架,其中包含所需的页面.XAML。这一切都像这样完美地运作着 private void addNewTab() { TabItem tab = new TabItem(); Grid g = new Grid(); Frame f = newFrame(); g.Children.Add(f); tab.Content = g; MyTabControl.

我有一个
TabConrol
,当用户做某些事情时,会以编程方式添加一个新的
TabItem
。此选项卡中有一个框架,其中包含所需的
页面.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;
}
问题是有时加载新的
可能需要一些时间。所以我想异步做这个。因此,当它加载时,可能会有一个加载动画。我想这会管用的

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;
}
private async void addNewTab()
{
TabItem tab=新TabItem();
网格g=新网格();
var test=Task.Factory.StartNew(()=>newFrame(selectTab,value));
等待测试;
f=试验结果;
g、 儿童。添加(f);
tab.内容=g;
MyTabControl.Items.Add(选项卡);
MyTabControl.SelectedItem=tab;
}
私有帧newFrame()
{
帧f=新帧();
//已删除框架的完整逻辑
f、 导航(新建MyPage());
返回f;
}
问题是它在
Frame f=new Frame()上返回follow错误newFrame()
中的code>

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

附加信息:调用线程必须是STA,因为许多 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
,以遵循最佳实践。

构建任何合理的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
以遵循最佳实践。

可能重复的