¿Cómo crear una tarea (TPL) ejecutando un hilo STA?

Usar Thread es bastante sencillo

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

¿Cómo lograr el mismo uso de tareas en una aplicación WPF? Aquí hay un código:

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

Obtengo una InvalidOperationException con

El hilo que llama debe ser STA, porque muchos componentes de UI lo requieren.

Puede usar el método TaskScheduler.FromCurrentSynchronizationContext para obtener un TaskScheduler para el contexto de sincronización actual (que es el despachador de WPF cuando está ejecutando una aplicación WPF).

Luego use la sobrecarga ContinueWith que acepte TaskScheduler:

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

Para cualquier visitante futuro que venga buscando el verdadero propósito de la pregunta:

  • Usando StaTaskScheduler como se StaTaskScheduler en esta respuesta
  • Versión DIY: establece ApartmentState en una tarea