如何创建运行 STA 线程的任务 (TPL)
本文关键字:线程 任务 TPL STA 运行 创建 何创建 | 更新日期: 2023-09-27 17:56:03
使用Thread非常简单
Thread thread = new Thread(MethodWhichRequiresSTA);
thread.SetApartmentState(ApartmentState.STA);
如何在 WPF 应用程序中使用任务完成相同的操作?下面是一些代码:
Task.Factory.StartNew
(
() =>
{return "some Text";}
)
.ContinueWith(r => AddControlsToGrid(r.Result));
我收到一个无效操作异常
调用线程必须是 STA,因为许多 UI 组件都需要这样做。
可以使用
TaskScheduler.FromCurrentSynchronizationContext 方法获取当前同步上下文(运行 WPF 应用程序时的 WPF 调度程序)的 TaskScheduler。
然后使用接受任务计划程序的 ContinueWith 重载:
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(...)
.ContinueWith(r => AddControlsToGrid(r.Result), scheduler);
Dispatcher.Invoke 可能是一个解决方案。
private async Task<bool> MyActionAsync()
{
// await for something, then return true or false
}
private void StaContinuation(Task<bool> t)
{
myCheckBox.IsChecked = t.Result;
}
private void MyCaller()
{
MyActionAsync().ContinueWith((t) => Dispatcher.Invoke(() => StaContinuation(t)));
}