如何创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