Question 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 faire de même avec les tâches dans une application WPF? Voici un 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 de l'interface utilisateur l'exigent.


64
2018-05-11 23:24


origine


Réponses:


Vous pouvez utiliser le TaskScheduler.FromCurrentSynchronizationContext, méthode pour obtenir un Planificateur de tâches pour le contexte de synchronisation actuel (qui est le répartiteur WPF lorsque vous exécutez une application WPF).

Ensuite, utilisez le Continue avec surcharge qui accepte un TaskScheduler:

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

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

67
2018-05-11 23:31



Pour les futurs visiteurs qui recherchent l’intention réelle de la question:


26
2018-04-21 20:00