web-dev-qa-db-fra.com

Comment créer une tâche (TPL) exécutant un thread STA?

L'utilisation de Thread est assez simple

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

Comment accomplir la même chose en utilisant des tâches dans une application WPF? Voici du code:

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

Je reçois une InvalidOperationException avec

Le thread appelant doit être STA, car de nombreux composants d'interface utilisateur l'exigent.

72
Michel Triana

Vous pouvez utiliser TaskScheduler.FromCurrentSynchronizationContext Method pour obtenir TaskScheduler pour le contexte de synchronisation actuel (qui est le répartiteur WPF lorsque vous exécutez une application WPF).

Utilisez ensuite la surcharge ContinueWith qui accepte un TaskScheduler:

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(...)
            .ContinueWith(r => AddControlsToGrid(r.Result), scheduler);
72
dtb

Pour tous les futurs visiteurs qui viennent à la recherche de la véritable intention de la question:

31
Mrchief