Fait à l'aide de Tâches (TPL) de la bibliothèque de faire une application multithread?
Récemment lors de son entrevue, j'ai eu cette question.
Q: Avez-vous écrit des applications multithread?
Un: Oui
Q: Soin d'expliquer plus?
Un: j'ai utilisé Tasks
(Task Parallel library) pour mener à bien certaines tâches comme waiting for some info from internet while loading UI
. Cela améliore ma ergonomie de l'application.
Q: Mais vous avez utilisé TPL
signifie que vous avez écrit un multithreaded
application?
Moi: (Pas sûr de ce say1)
Alors, quelle est exactement une application multi-thread? Est-il différent de l'utilisation de Tasks
?
Vous devez vous connecter pour publier un commentaire.
Tâches peut être utilisé pour représenter les opérations se déroulant sur plusieurs threads, mais ils n'ont pas ont pour. Un peut écriture complexe TPL applications qui n'ont jamais exécuter dans un thread unique. Lorsque vous avez une tâche qui, par exemple, représente un réseau demande de certaines données, la tâche est pas va créer des threads supplémentaires pour atteindre cet objectif. Un tel programme est (je l'espère), asynchrone, mais pas nécessairement mutlithreaded.
Parallélisme est en train de faire plus d'une chose en même temps. Cela peut ou peut ne pas être le résultat de plusieurs threads.
Allons-y avec une analogie ici.
Ici est de savoir comment Bob cuisiniers dîner:
Bob a cuit entièrement de façon synchrone avec pas de multithreading, asynchronisme, ou le parallélisme lors de la cuisson de son dîner.
Ici est de savoir comment Jane cuisiniers dîner:
Jane effet de levier asynchrone de cuisson (sans le multithreading) pour atteindre le parallélisme lors de la cuisson de son dîner.
Ici est de savoir comment Servy faire le dîner:
Servy à effet de levier de plusieurs threads (les travailleurs) qui ont, chacun, individuellement, ont fait leur travail de façon synchrone, mais qui ont travaillé de manière asynchrone par rapport à l'autre pour atteindre le parallélisme.
Bien sûr, cela devient d'autant plus intéressant si l'on considère, par exemple, si notre cuisinière à deux brûleurs, ou un seul. Si notre cuisinière à deux brûleurs ensuite, nos deux fils, Bob et Jane, sont à la fois capables de faire leur travail sans se des uns des autres et en route, un peu. Ils peuvent rencontrer des épaules un peu, ou chacun essaye d'attraper quelque chose du même cabinet, chaque maintenant et puis, donc ils vont chacun être ralenti un peu, mais pas beaucoup. Si ils ont besoin de partager un seul élément de cuisinière mais alors ils ne seront pas en mesure de faire grand-chose, à chaque fois que l'autre personne est en train de faire le travail. Dans ce cas, le travail ne se fait plus rapidement que d'avoir une personne qui fait la cuisine entièrement synchrone, comme Bob fait quand il est sur son propre. Dans ce cas, nous sommes la cuisine avec plusieurs threads, mais notre cuisine n'est pas parallélisé. Pas tous multithread travail est fait en parallèle, un travail. C'est ce qui se passe lors de l'exécution de plusieurs threads sur une machine avec un CPU. Vous n'avez pas réellement faire le travail plus rapidement que simplement en utilisant un thread, parce que chaque thread est juste de prendre les virages en faisant le travail. (Cela ne signifie pas que les programmes multithread sont inutiles sur un des cœurs de Processeurs, ils ne le sont pas, c'est juste que la raison pour leur utilisation n'est pas pour améliorer la vitesse.)
On peut même considérer la façon dont ces cuisiniers aurait à faire leur travail à l'aide de la Task Parallel Library, pour voir quelles sont les utilisations de la TPL correspondent à chacun de ces types de cuisine:
Donc tout d'abord nous avons bob, l'écriture juste normal de non-TPL code et de tout faire de manière synchrone:
Puis nous avons Jane, qui commence deux opérations asynchrones, puis attend pour deux d'entre eux après le départ de chacun d'entre eux pour calculer son résultat.
Comme un rappel ici, Jane est à l'aide de la TPL, et elle fait bien son travail en parallèle, mais elle n'est qu'à l'aide de un seul thread de faire son travail.
Puis nous avons Servy, qui utilise
Task.Run
de créer une tâche qui représente le fait de travailler dans un autre thread. Il commence à deux différentes catégories de travailleurs, a chaque fois de façon synchrone faire un peu de travail, et puis attend pour les deux travailleurs à la fin.awesome
. Grande Analogie. Merci 🙂That doesn't mean multithreaded programs are pointless on one cores CPUs, they're not, it's just that the reason for using them isn't to improve speed
- même sur un seul PROCESSEUR, il pourrait être d'importants gains de vitesse lorsque le programme implique des opérations d'e/S (et n'est-ce pas essentiellement de la "Jeanne" exemple de asynchrone mono-thread de l'application?)Un
Task
est une promesse pour l'avenir que le travail soit terminé. Lorsque vous l'utilisez, vous pouvez l'utiliser pourI/O based
travail, qui ne pas nécessitent l'utilisation de plusieurs threads d'exécution de code. Un bon exemple est l'utilisation de C# 5 est la caractéristique deasync/await
avecHttpClient
qui n'réseau d'e/S de travail.Cependant, vous pouvez profiter de la
TPL
faire multithread travail. Par exemple, lors de l'utilisation deTask.Run
ouTask.Factory.Startnew
pour démarrer une nouvelle tâche, derrière les coulisses, le travail est en attente pour vous sur leThreadPool
, qui leTPL
résumés loin pour nous, vous permettant d'utiliser plusieurs threads.Un scénario commun pour l'utilisation de plusieurs threads, c'est quand vous avez CPU de travail qui peut être fait simultanément (en parallèle). De travail avec une application multithread vient avec une grande responsabilité.
Nous voyons donc que la collaboration avec le
TPL
ne marche pas necasserly dire l'utilisation de plusieurs threads, mais vous avez certainement peut l'utiliser pour faire du multithreading.Smart question, Tâche != Multi-thread, à l'Aide de TaskCompletionSource vous pouvez créer un
Task
qui peuvent s'exécuter dans le thread(peut être thread d'INTERFACE utilisateur uniquement) lui-même.Task
est juste une abstraction au-dessus d'une opération qui peut se terminer dans l'avenir. Cela ne signifie pas que le code est multi-thread. GénéralementTask
implique le multi-threading, pas nécessairement toujours.Et garder à l'esprit qu'avec la connaissance de
TPL
vous ne pouvez pas dire que vous connaissez le multi-threading. Il existe de nombreux concepts dont vous avez besoin pour couvrir.et bien sûr Task parallel library trop.
Remarque: ce n'est pas la liste complète, ce sont juste à partir du haut de ma tête.
Ressources pour apprendre:
Pour enfiler seul, je suggère http://www.albahari.com/threading/
Pour visionner des didacticiels vidéo, je suggère Pluralsight. Il est payé mais ça vaut le coût.
Dernier mais non le moindre: Oui bien sûr, Il est Stackoverflow.
task-parallel-library
balise wiki a quelques livres électroniques gratuits répertoriés.Mes 5 cents: vous n'avez pas à engager des threads explicitement avec
Task.Run
ouTask.Factory.StartNew
pour faire de votre TPL application multithread. Considérez ceci:Le code après
await
à l'intérieur dedoAsync
est exécutée simultanément sur différents threads. De manière similaire, la concurrence peut être introduite avec async API sockets,HttpClient
,Stream.ReadAsync
ou quoi que ce soit d'autre qui utilise le pool de thread (y compris les IOCP pool de threads).Métaphoriquement parlant, chaque .NET application est deja multithread, parce que le Framework utilise
ThreadPool
largement. Même une simple application console affichera plus d'un thread pourSystem.Diagnostics.Process.GetCurrentProcess().Threads.Count
. Votre interlocuteur doit vous avons demandé si vous avez écrit simultanées (ou en parallèle) du code.