La différence entre le TPL & async/await (la manipulation du Fil)

Essayer de comprendre la différence entre le TPL & async/await quand il s'agit de la création de threads.

Je crois que le TPL (TaskFactory.StartNew) fonctionne de manière similaire à ThreadPool.QueueUserWorkItem en ce qu'il met en file d'attente de travail sur un thread dans le pool de threads. C'est bien sûr, sauf si vous utilisez TaskCreationOptions.LongRunning qui crée un nouveau thread.

J'ai pensé async/await fonctionnerait de la même façon donc, essentiellement:

TPL:

Factory.StartNew( () => DoSomeAsyncWork() )
.ContinueWith( 
    (antecedent) => {
        DoSomeWorkAfter(); 
    },TaskScheduler.FromCurrentSynchronizationContext());

Async/Await:

await DoSomeAsyncWork();  
DoSomeWorkAfter();

serait identique. De ce que j'ai lu, il semble que async/await seulement "parfois" crée un nouveau thread. Alors quand est-il de créer un nouveau thread et quand n'est-il pas de créer un nouveau thread? Si nous avions affaire à IO ports de fin je le vois pas avoir à créer un nouveau fil de discussion, mais sinon je pense qu'il faudrait. Je suppose que ma compréhension de FromCurrentSynchronizationContext toujours était un peu floue aussi. J'ai toujours pensé que c'était, en substance, le thread de l'INTERFACE utilisateur.

  • En Fait, TaskCreationOptions.LongRunning ne garantit pas un "nouveau fil". Par MSDN, le "LongRunning" option ne fournit qu'un indice pour le planificateur; il ne garantit pas un thread dédié. J'ai trouvé que la manière dure.
  • bien que ce que vous dites à propos de la documentation est correcte, j'ai regardé le TPL du code source d'un moment de retour et je suis assez sûr que, en fait, un nouveau thread dédié est toujours créé lors de TaskCreationOptions.LongRunning est spécifié.
  • Vous voudrez peut-être prendre un autre regard. Je sais que c'était la mise en commun des discussions Thread.CurrentThread.IsThreadPoolThread était de retourner true pour court-threads en cours d'exécution de quelques centaines de millisecondes. sans parler de la ThreadStatic variables j'ai été en utilisant des saignements dans plusieurs threads, ce qui entraîne toutes sortes de havok. J'ai eu la force de mon code à nouveau plusieurs Thread()s, old school, afin de garantir un thread dédié. En d'autres termes, je ne pouvais pas utiliser le TaskFactory pour les threads dédiés. Eventuellement, vous pouvez mettre en place votre propre TaskScheduler qui renvoie toujours un thread dédié.
InformationsquelleAutor coding4fun | 2012-04-23