如何创建运行 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 组件都需要这样做。

如何创建运行 STA 线程的任务 (TPL)

可以使用

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)));
    }