我在代码运行时为加载动画制作了一个简单的异步方法。运行的代码将控件添加到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());
)
在代码运行时,我是否只需为一个简单的动画栏创建一个大线程等?
答案 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")
。