STA为非创建的线程/任务

时间:2017-09-11 11:07:05

标签: c# multithreading

我在代码运行时为加载动画制作了一个简单的异步方法。运行的代码将控件添加到stackpanel。

在Page_Loaded事件中我只有:

Test();

在Test()中我有

private async void Test()
{
   testbtn.Visibility = Visibility.Visible;
   await Task.Run(() => LoadAll());
   testbtn.Visibility = Visibility.Collapsed;
}

和LoadAll()是DockPanels等。 例如:

DockPanel headerpanel = new DockPanel();
headerpanel.LastChildFill = false;

运行此时,我收到错误,因为线程不是STA线程。 即使我没有创建一个Thread,我怎样才能使它成为STA。 (只有await Task.Run(() => LoadAll());

在代码运行时,我是否只需为一个简单的动画栏创建一个大线程等?

2 个答案:

答案 0 :(得分:2)

您可以在允许安全执行UI代码的调度程序中运行任务:

private async void Test()
{
    testbtn.Visibility = Visibility.Visible;
    TaskScheduler scheduler = TaskScheduler.FromCurrentSynchronizationContext();
    await Task.Factory.StartNew(() => LoadAll(),
        CancellationToken.None, TaskCreationOptions.None, scheduler);
    testbtn.Visibility = Visibility.Collapsed;
}

答案 1 :(得分:1)

  

在代码运行时,我是否只需为一个简单的动画栏创建一个大线程等?

没有;只是不要在后台线程上做UI工作。请改用IProgress<T> / Progress<T>,例如:

private async void Test()
{
  testbtn.Visibility = Visibility.Visible;
  IProgress<string> progress = new Progress<string>(value => { ... });
  await Task.Run(() => LoadAll(progress));
  testbtn.Visibility = Visibility.Collapsed;
}

并在LoadAll想要更新用户界面时调用progress.Report("update")