Macht die Verwendung von Tasks (TPL) eine Anwendung zu einer Multithreadanwendung?
Als vor kurzem interviewt habe, bekam ich diese Frage stellen.
Q: Haben Sie geschriebene Multithread-Anwendungen?
A: Ja
Q: Pflege, mehr zu erzählen?
Einen: ich habe Tasks
(Task Parallel library) für die Durchführung einiger Aufgaben wie waiting for some info from internet while loading UI
. Das verbessert meine Anwendung usability.
Q: Aber, nur, die Sie verwendet haben TPL
bedeutet, dass Sie geschrieben haben, eine multithreaded
Anwendung?
Mir: (Nicht sicher, was zu say1)
So, was genau eine multi-threaded-Anwendung? Ist es anders als mit Tasks
?
InformationsquelleAutor der Frage now he who must not be named. | 2014-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufgaben kann werden verwendet zum darstellen von Operationen, die auf mehrere threads, die sich aber nicht haben. Eine kann schreiben komplexe TPL-Anwendungen, die immer nur führen Sie in einem einzigen thread. Wenn Sie haben eine Aufgabe, die zum Beispiel repräsentiert ein Netzwerk-request einige Daten, das ist Aufgabe nicht erstellen zusätzliche threads, um dieses Ziel zu erreichen. Solch ein Programm ist (hoffentlich) asynchron, aber nicht unbedingt mutlithreaded.
Parallelität ist dabei mehr als eine Sache zur gleichen Zeit. Dies kann oder kann nicht das Ergebnis mehrerer threads.
Let ' s go mit einer Analogie hier.
Ist hier, wie Bob kocht Abendessen:
Bob gekocht hat völlig synchron ohne multithreading, asynchrone oder Parallelität beim Kochen sein Essen.
Hier ist, wie Jane kocht Abendessen:
Jane leveraged asynchrone Kochen (ohne multithreading), um Parallelität zu erreichen, wenn das Kochen Ihr Abendessen.
Hier ist, wie Servy kocht Abendessen:
Servy leveraged mehrere threads (Arbeitnehmer), die jeder individuell hat Ihre arbeiten synchron, aber wer arbeitet asynchron in Bezug auf jedes andere, um Parallelität zu erreichen.
Natürlich, dies wird umso interessanter, wenn wir betrachten, zum Beispiel, ob der Ofen verfügt über zwei Brenner oder nur einer. Wenn der Ofen verfügt über zwei Brenner dann unsere beiden threads, Bob und Jane sind beide in der Lage, Ihre Arbeit zu tun, ohne sich in die Quere, viel. Sie stoßen könnte den Schultern ein wenig, oder jede versuchen Sie etwas greifen aus dem gleichen Schrank, jeden jetzt und dann, so werden Sie auf jeden abgebremst werden eine bit, aber nicht viel. Wenn Sie jeden Bedarf zu teilen einer einzigen Herdplatte, obwohl Sie dann nicht eigentlich in der Lage sein zu bekommen, viel überhaupt getan, wenn die andere person tut Arbeit. In diesem Fall, die Arbeit wird nicht wirklich tun alle schneller als nur mit einer person zu tun, die Kochen ganz synchron, wie Bob es tut, wenn er auf seinen eigenen. In diesem Fall sind wir das Kochen mit mehreren threads aber unsere Küche ist nicht parallelisiert. Nicht alle Multithread-Arbeit ist eigentlich, die parallel arbeiten. Dies ist, was passiert, wenn bei der Ausführung von mehreren threads auf einer Maschine mit einer CPU. Sie eigentlich nicht die Arbeit zu erledigen schneller als nur mit einem thread, da jeder thread nur abwechselnd arbeiten. (Das bedeutet nicht, dass Multithread-Programme sind sinnlos, auf einer Kerne-CPUs, Sie sind es nicht, es ist nur, dass der Grund für die Verwendung von Ihnen nicht um die Geschwindigkeit zu erhöhen.)
Können wir auch überlegen Sie, wie diese Köche tun würden, Ihre Arbeit mit der Task Parallel Library, um zu sehen, was nutzt die TPL entsprechen, um jede dieser Arten von Köche:
Also müssen wir zuerst bob, nur zu schreiben, normale, nicht-TPL-code und machst alles synchron:
Haben wir dann Jane, die beginnt zwei verschiedene asynchrone Operationen, wartet dann, bis beide nach dem starten jeden von Ihnen zu berechnen Ihr Ergebnis.
Als Erinnerung hier, Jane ist mit der TPL, und das macht Sie viel von Ihrer Arbeit in parallel, sondern Sie ist nur mit einem einzigen thread um Ihre Arbeit zu tun.
Dann haben wir Servy, wer nutzt
Task.Run
um eine Aufgabe zu erstellen, die stellt die Arbeit in einem anderen thread. Er beginnt zwei verschiedene Arbeitnehmer, hat Sie die jeweils die beiden synchron zu tun einige Arbeit, und wartet dann, bis der Arbeitnehmer zu beenden.InformationsquelleAutor der Antwort Servy
Einen
Task
ist ein Versprechen für die Zukunft arbeiten abgeschlossen werden. Wenn Sie es, Sie können es verwenden, fürI/O based
Arbeit, die nicht verlangen, dass Sie die Verwendung mehrerer threads für die Ausführung von code. Ein gutes Beispiel ist das verwenden von C# 5-Funktion vonasync/await
mitHttpClient
was bedeutet Netzwerk-basierte I/O-arbeiten.Jedoch, können Sie die Vorteile der
TPL
zu tun multithreaded arbeiten. Zum Beispiel, wenn SieTask.Run
oderTask.Factory.Startnew
um eine neue Aufgabe, die Arbeit hinter den kulissen bekommt in der Warteschlange für die Sie auf derThreadPool
, die dieTPL
abstracts Weg für uns, so dass die Verwendung mehrerer threads.Einem gemeinsamen Szenario für die Verwendung von mehreren threads ist, wenn Sie der CPU Arbeit, die getan werden kann, gleichzeitig (parallel). Arbeitet mit einer multithreaded-Anwendung kommt mit großer Verantwortung.
So sehen wir, dass die Arbeit mit den
TPL
nicht ganz necasserly bedeuten mehrere threads verwenden, aber Sie auf jeden Fall nutzen können, es zu tun multithreading.InformationsquelleAutor der Antwort Yuval Itzchakov
Intelligente Frage, Task != Multi-threaded, Mit TaskCompletionSource können Sie erstellen eine
Task
dem ausführen im single-thread(UI-thread nur) sich selbst.Task
ist nur eine Abstraktion über eine operation, die abgeschlossen werden kann in Zukunft. Es bedeutet nicht, code ist multi-threaded. In der RegelTask
beinhaltet multi-threading, nicht unbedingt immer.Und denken Sie daran, nur mit Kenntnis der
TPL
man kann nicht sagen, dass Sie wissen multi-threading. Es gibt viele Konzepte, die Sie decken müssen.und natürlich die Task parallel library zu.
Hinweis: dies ist nicht die vollständige Liste, diese sind nur aus der Spitze von meinem Kopf.
Ressourcen zu lernen:
Zum einfädeln allein, ich schlage vor, http://www.albahari.com/threading/
Für video-tutorials, schlage ich vor,Pluralsight. Es ist bezahlt, aber den Preis Wert.
Last but not least: ja, natürlich, Es ist Stackoverflow.
InformationsquelleAutor der Antwort Sriram Sakthivel
Meine 5 Cent: Sie haben nicht zu engagieren threads explizit mit
Task.Run
oderTask.Factory.StartNew
um Ihren TPL Multithread-Anwendung. Bedenken Sie:Den code nach
await
innendoAsync
ausgeführt wird, die gleichzeitig auf verschiedene threads. In ähnlicher Weise, Parallelität kann eingeführt werden mit asynchronen sockets-APIHttpClient
,Stream.ReadAsync
oder irgendetwas anderes, das verwendet thread-pool (einschließlich der IOCP-pool-threads).Bildlich gesprochen, jeden .NET-Anwendung ist bereits multithreaded, da das Framework verwendet
ThreadPool
ausgiebig. Selbst eine einfache Konsole-Anwendung wird zeigen, mehr als einen thread fürSystem.Diagnostics.Process.GetCurrentProcess().Threads.Count
. Ihren Gesprächspartner sollten Sie fragte, ob Sie geschrieben haben gleichzeitige (oder parallel) - code.InformationsquelleAutor der Antwort Noseratio