80 votes

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

Utiliser Thread est assez simple

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

Comment accomplir la même chose en utilisant Tasks dans une application WPF? Voici du code:

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

Je reçois une exception InvalidOperationException avec

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

76voto

dtb Points 104373

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

Ensuite, utilisez la ContinueWith surcharge qui accepte un TaskScheduler:

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

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

33voto

Mrchief Points 25418

Pour tous les futurs visiteurs qui viennent chercher l'intention réelle de la question:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X