如何创build一个运行STA线程的任务(TPL)?

使用线程非常简单

Thread thread = new Thread(MethodWhichRequiresSTA); thread.SetApartmentState(ApartmentState.STA); 

如何使用WPF应用程序中的任务来完成相同的任务? 这里是一些代码:

 Task.Factory.StartNew ( () => {return "some Text";} ) .ContinueWith(r => AddControlsToGrid(r.Result)); 

我得到一个InvalidOperationException

调用线程必须是STA,因为许多UI组件都需要这个。

您可以使用TaskScheduler.FromCurrentSynchronizationContext方法获取当前同步上下文(在运行WPF应用程序时是WPF调度程序)的TaskScheduler 。

然后使用接受TaskScheduler的ContinueWith重载:

 var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(...) .ContinueWith(r => AddControlsToGrid(r.Result), scheduler); 

对于任何未来的访问者来看这个问题的真正意图:

  • 使用StaTaskScheduler在这个答案指出
  • DIY版本: 在任务上设置ApartmentState