C# - Delegaten und Threads!
Was muss ich genau tun Delegierten, und threads für?
- Hausaufgaben? dies ist eine sehr fundamentale Frage
- Auch wenn es sein könnte, grundlegend ist es immer noch eine legitime Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Delegierten handeln, wie der logische (aber sicher) entspricht Funktion-Zeiger, die es erlauben, Sie sprechen über eine operation in einer abstrakten Art und Weise. Das typische Beispiel für diese Veranstaltungen, aber ich werde, eine "funktionale Programmierung" Beispiel: Suche in einer Liste:
Dem "lambda" hier ist im wesentlichen eine Instanz des delegate - Delegierter der Typ
Predicate<Person>
- also "angesichts einer person, ist etwas, das wahr oder falsch". Die Verwendung von Stellvertretern erlaubt eine sehr flexible code - d.h. dieList<T>.Find
Methode können alle möglichen Dinge auf der Grundlage der Stellvertretung, dass der Aufrufer übergibt.In dieser Weise agieren Sie weitgehend wie ein 1-Methode, Schnittstelle - sondern viel mehr kurz und bündig.
Die Delegierten: Grundsätzlich gilt, dass ein Delegat ist eine Methode zum verweisen auf eine Methode. Es ist wie ein Zeiger auf eine Methode, die Sie können Sie auf verschiedene Methoden, die mit seiner Unterschrift und verwenden Sie zum übergeben der Referenz auf diese Methode um.
Thread ist ein sequentual Strom von Anweisungen, die ausgeführt werden einer nach dem anderen zum abschließen einer Berechnung. Sie können unterschiedliche threads gleichzeitig ausgeführt, um eine spezifische Aufgabe auszuführen. Ein thread läuft auf einem logischen Prozessor.
Delegaten werden verwendet, um die add-Methoden, um die Ereignisse dynamisch.
Threads laufen innerhalb von Prozessen, und ermöglichen es Ihnen, 2 oder mehr Aufgaben auf einmal, die Ressourcen freigeben.
Ich würde vorschlagen, eine Suche auf diese Bedingungen, es gibt viel Informationen da draußen. Sie sind ziemlich grundlegende Konzepte, wiki ist eine high-level Ort, um zu starten:
http://en.wikipedia.org/wiki/Thread_(computer_science)
http://en.wikipedia.org/wiki/C_Sharp_(programming_language)
Konkrete Beispiele helfen mir, damit hier für threads. Betrachten Sie Ihre web-server. Als Anfragen ankommen auf dem server, Sie sind geschickt, um die Web-Server-Prozess für die Handhabung. Es könnte jeweils behandeln, wie es kommt, voll der Verarbeitung der Anfrage und der Herstellung der Seite, bevor Sie zum nächsten. Aber Bedenken Sie nur, wie ein Großteil der Verarbeitung erfolgt auf Festplatte beschleunigt (eher als die CPU-Geschwindigkeiten) als die angeforderte Seite gezogen wird, von der Festplatte (oder die Daten aus der Datenbank abgerufen), bevor die Antwort erfüllt werden können.
Durch ziehen von threads aus einem thread-pool und geben jede Anfrage einen eigenen thread, wir kümmern uns um die non-Festplatte benötigt für Hunderte von Anfragen vor der Scheibe hat die zurückgegebenen Daten für die erste. Damit wird ein Grad der virtuelle Parallelität kann erheblich verbessern die Leistung. Beachten Sie, dass es viel mehr ist, als die Leistung des Webservers, aber das sollte Ihnen ein konkretes Modell, wie threading kann nützlich sein.
Sind Sie nützlich für den gleichen Grund, warum high-level-Sprachen sind nützlich. Sie brauchen Sie nicht für nichts, da Sie wirklich, Sie sind nur Abstraktionen, die über das, was wirklich passiert ist. Sie machen die Dinge deutlich einfacher und schneller zu Programmieren oder zu verstehen.
Marc Gravell eine nette Antwort für " was ist ein Delegierter.'
Andrew Troelsen definiert einen thread als
Alle Prozesse auf Ihrem system laufen haben mindestens einen thread. Nennen wir es der Haupt-thread. Sie erstellen können zusätzliche threads für eine Vielzahl von Gründen, aber das deutlichste Beispiel für die Veranschaulichung der Zweck des threads ist Druck.
Angenommen, Sie öffnen Sie Ihre Lieblings-Textverarbeitung (WPA), geben Sie ein paar Zeilen, und dann drucken möchten diese Zeilen. Wenn Ihr WPA benutzt den Haupt-thread, um das Dokument zu drucken, die WPA-Benutzeroberfläche wird 'eingefroren', bis der Druckvorgang abgeschlossen ist. Dies ist, weil der main-thread hat, drucken Sie die Zeilen, bevor es verarbeitet alle Ereignisse der Benutzeroberfläche, d.h., Mausklicks, Mausbewegungen, etc.. Es ist, als wenn der code wie folgt geschrieben:
Klar, das ist nicht das, was die Anwender wollen. Benutzer möchten, dass die Benutzer-Oberfläche reagieren, während das Dokument gedruckt wird.
Die Antwort, natürlich, ist der Druck der Linien in einem zweiten thread. Auf diese Weise kann die Benutzeroberfläche Fokus auf die Bearbeitung der Ereignisse der Benutzeroberfläche, während der sekundäre thread konzentriert sich auf das drucken der Linien.
Ist die illusion, dass beide Aufgaben gleichzeitig passieren. Auf einem einzelnen Prozessor-Computer, das kann nicht wahr sein, da der Prozessor kann nur ausführen, ein thread zu einem Zeitpunkt. Jedoch Umschalten zwischen den threads geschieht so schnell, dass die illusion ist in der Regel erhalten. Auf einem multi-Prozessor - (oder Multi-core) Maschine, dies kann buchstäblich wahr, da der Haupt-thread kann ausgeführt auf einem Prozessor, während das sekundäre thread läuft auf einem anderen Prozessor.
In .NET, einfädeln ist ein Kinderspiel. Sie nutzen das System.Threading.ThreadPool-Klasse, die asynchrone Delegaten oder erstellen Sie Ihre eigenen System.Threading.Thread-Objekte.
Wenn Sie ein neues threading, ich würde werfen aus zwei Verwarnungen.
Ersten, Sie können tatsächlich verletzt Ihrer Anwendung Leistung, wenn Sie wählen die falsche threading-Modell. Seien Sie vorsichtig, um zu vermeiden, mit zu vielen threads oder versuchen, thread Dinge die wirklich passieren hintereinander.
Zweitens (und wichtiger), sich bewusst sein, dass, wenn Sie teilen Daten zwischen den threads, werden Sie wahrscheinlich benötigen, um Synchronisation Zugriff auf die freigegebenen Daten, z.B. über das lock-Schlüsselwort in C#. Es gibt eine fülle von Informationen zu diesem Thema online zur Verfügung, so dass ich es hier nicht wiederholen werde. Just bewusst sein, dass Sie ausführen können, in eine intermittierende, nicht immer reproduzierbare Fehler, wenn Sie das nicht tun Sie dies sorgfältig.
Ihre Frage ist zu vage...
Aber Sie wahrscheinlich wollen einfach nur wissen, wie Sie zu benutzen, um ein Fenster, ein zeitaufwendiger Prozess ausgeführt wird, und einem Fortschrittsbalken...
So erstellen Sie einen thread für den zeitaufwendigen Prozess, und verwenden Sie den Delegierten zu erhöhen, den Fortschritt-bar! 🙂