Sie können auf einen Fehler stoßen, der auf das Runtime Concurrency Coordination Guide verweist. Es gibt mehrere Möglichkeiten, diese Art von Problem zu lösen, über die wir in Kürze sprechen werden.
Genehmigt: Fortect
Präsentation
Concurrency and Runtime Coordination (CCR) ist ein asynchrones Messaging-Verzeichnis für die .NET-Plattform, das einen bestimmten Satz leistungsstarker kleiner Primitive bereitstellt, von denen die meisten einen geeigneten anderen Ansatz für die Strukturierungsfähigkeiten ermöglichen. Die effektive Verwendung von CCR sollte es der Anwendung ermöglichen, etwas reaktiver, größer und höchstwahrscheinlich zuverlässiger zu sein. Das Tolle an der Lösung dieses Problems ist, dass sie bei gleicher Erfahrung beeindruckende Vorteile bringen können, indem sie die Notwendigkeit für ein Geschäft reduzieren (und manchmal sogar eliminieren), explizit mit Threads (und Überraschungen in all diesen Threads), Sperren, Mutexes und mehr . Synchronisationsprimitive auf niedriger Ebene.
Wenn es sich bei Ihrer Anwendung um eine winzige Single-Thread-Anwendung handelt, können Sie schneller reagieren und die verfügbaren Kernel besser nutzen, während die konzeptionelle Einfachheit Ihrer vorherigen Codebasis beibehalten wird. Wenn Ihre Anwendung normalerweise bereits Multithreaded ist, kann CCR alternativ den Durchsatz Ihres primären Systems angleichen (und manchmal verbessern) und gleichzeitig Ihre persönliche Codebasis vereinfachen.
- Einfache und effiziente Implementierung von Online-Messaging. Extrem leichte und sichere Programme verbinden Gadgets in einer schauspielerorientierten Sicht und verbinden den Planeten.
- -Definition hat einfache Scheduling-Einschränkungen. Planung ist zweifellos Es ist die Daseinsberechtigung von CCR. Sie stellen für Ihren Prozess Aufgaben zusammen und senden Nachrichten an andere Teile, und Sie verwenden physische Objekte, die als Arbiter bezeichnet werden, um die Grenzen festzulegen, unter denen ein Mann die Ergebnisse sowie eingehende Anfragen verarbeiten kann. CCR stellt sicher, dass diese Einschränkungen bezahlt werden, bevor Ihr Code ausgeführt wird.
- ist ein Modell des Nachdenkens über Schach. CCR bietet eine kausale Beziehung, ein Mittel, um den Kontext durch Ihre eigene Reihe der gleichen asynchronen Unteraufgaben zu verbreiten, so dass im Falle einer Aufgabe ein Vehikel (dh nicht auf Ihren Thread, der erstellt wurde, in l ‘Ursprung) .
- Bessere Nutzung der verfügbaren (und zukünftigen) Konserven. CCR funktioniert entweder über einen vorhandenen Thread-Bereich oder, wenn Sie es vorziehen, über einen eigenen benutzerdefinierten Start, der in einigen Fällen eine bessere Leistung bietet. Die Auswirkungen dieses Mechanismus auf Ihren Programmcode werden jedoch normalerweise minimiert.
- Einfachere Integration von asynchronen E/A-Standorten. Der Schlüssel zur Verbesserung der Skalierbarkeit und Performance Bei diesen einzelnen Prozessen geht es oft darum, die Art der Effizienz von I/O-Operationen zu verbessern. Da diese Produkttypen im Vergleich zu Rechenaufgaben in der Regel langsamer sind, führt das Blockieren von E / A dazu, dass nützliches Zubehör (in diesem Fall Threads) entdeckt und für andere anstehende Anforderungen verwendet wird. Durch die asynchrone Verteilung von I/O kann diese Computersoftware andere Aufgaben bearbeiten, bis die Operationen abgeschlossen sind. Asynchrone Sequenzierungsoperationen trennen jedoch häufig den Neustart jeder Operation von ihrem Abschluss, der in schwer zu berücksichtigendem Quellcode abgeschlossen ist. CCR verwendet eine neue Implementierung von C-Zahl-Iteratoren, um Operationen zu verwalten.
Die
Better
Mit “asynchroner Nachrichtenübermittlung” meinen wir das, was die Zubehörteile Daten austauschen, Daten an jeden mit ihnen verknüpften senden, und darüber hinaus die Daten und eine Menge Leute nachfolgende Antworten haben keine garantierte kurze Verbindung. Oftmals wird eine gesendete Nachricht irgendwann in der Zukunft als gesendet angezeigt und danach wird höchstwahrscheinlich einfach eine Antwort erhalten.
Obwohl rein prozessintegriert, bietet der Einsatz von CCR tatsächlich etwas strengere Garantien, ein Verfahren, das gerade für Modelle wichtig ist, die hauptsächlich Interprozess-Computing betreffen, wo immer wieder Fehlerpotenziale vorhanden sind. Dies macht CCR-Primitive nicht nur für I/O auf einem vernünftigen Niveau sehr nützlich, sondern auch als jede Art von Baustein zum Aufbau skalierbarer verteilter Systeme.
Grundlagen aller CCR-Typen
CCR besteht aus einer kleineren Anzahl von generischen Typen:
- Aufgaben. Jeder Teil mit (Ihrem) Code, den Sie ausführen können.
- Joblisten. Genauer gesagt, DispatcherQueues. Nur eine bedeutende Liste anstehender Aufgaben. Threads, die einem Vanilla CLR-Thread-Pool oder möglicherweise einem CCR-Buy-Thread-Pool (auch bekannt als Dispatcher) folgen, werden in die Warteschlange gestellt und führen diese Aufgaben aus.
- -Ports. Dies sind In-Process-Message-Phrasen, die Komponenten verbinden. Im Grunde nicht mehr als viel mehr verlinkte Listen, stellen Anbieter Nachrichten von Ports. CCR bietet generische Überladungen für einfache Sicherheit vom Typ.
- Richter. Dies sind alle Primitive CCR, die die Kommunikation zwischen dem Move und der Task ermöglichen. Sie definieren die Bedingungen, unter denen das Deployment erstellt werden soll, wann die Nachricht einer Person am Port angeboten wird und etwas, das die Taskline empfängt. Es gibt Mengenarbiter, die mit CCR ausgeliefert werden, und viele dieser Unternehmen können in Top-Level-Builds gruppiert werden.
Wenn Sie diese grundlegenden Konzepte aus dem Weg geräumt haben, sehen Sie sich keinen einfachen CCR-Rabattcode an. Lassen Sie uns zunächst ein einfaches funktionales C#-Kontrollsystem definieren, das wir für all diese Beispiele für Webhosting-Anbieter verwenden werden. Beachten Sie, dass wir in dieser Prozessanwendung für wichtige Fakten einen benutzerdefinierten CCR-Thread-Pool (Dispatcher) verwenden und unsere Aufgabe anhängen, die dies kann. Dies bedeutet, dass Tasks in der Zeile sie auf Threads ausführen, die erfolgreich zu diesem benutzerdefinierten Pool gehören.
static void Main ( string [] args) j (var dr = neuer Dispatcher ()) c (var taskQueue = new DispatcherQueue ( "samples", DR) ) // Beispiele finden Sie hier passend ... // Sie benötigen eine callstrong-Blockierung, um das Beenden der Anwendung positiv zu verhindern
//.
Console.ReadLine ();
Obwohl die hier bereitgestellten tatsächlichen Beispiele die einzig richtige Funktionalität für eine einzelne Auftragswarteschlange sind, können Sie feststellen, dass es empfohlen wird, mehrere Aufgabenwarteschlangen zu verwenden. CCR zirkuliert zwischen Auftragswarteschlangen, die während des Auftragsabrufs vorgesehen sind, um zu verhindern, dass jede einzelne Auftragswarteschlange durch andere erschöpft wird.
Genehmigt: Fortect
Fortect ist das weltweit beliebteste und effektivste PC-Reparaturtool. Millionen von Menschen vertrauen darauf, dass ihre Systeme schnell, reibungslos und fehlerfrei laufen. Mit seiner einfachen Benutzeroberfläche und leistungsstarken Scan-Engine findet und behebt Fortect schnell eine breite Palette von Windows-Problemen - von Systeminstabilität und Sicherheitsproblemen bis hin zu Speicherverwaltung und Leistungsengpässen.
Lassen Sie uns vorerst nur ein direktes Klassifizierungsproblem reduzieren. Dies ist oft der einfachste Weg, um eine Routine in CCR zu starten, und wir brauchen nicht einmal einen Port. Die Arbiter-Klasse umfasst auch eine Reihe verschiedener bequemer Methoden. FromHandler() erstellt einfach aus jedem Delegaten eine mühsame Aufgabe – in diesem Fall eine weitere anonyme. Es wird dann in eine vertrauenswürdige Warteschlange von persönlichen Aufgaben gestellt, die nur von jedem einzelnen Disponenten ausgeführt werden.
Es muss nicht unbedingt so oft sein, Aufgaben direkt und tatsächlich in Bezug auf die Warteschlange zu platzieren; der Port kann meist irgendwo angefordert werden. Im nächsten Snippet geben wir einen Port für jeden Arbiter an und senden diese Nachricht dann an einen bestimmten Port. In diesem Rechtsstreit haben wir eine Art typisierte String-Schnittstelle und eine Handler-Signatur, die String.Color ist gleich “# 008000″> //
var = new port << span color = "# 0000ff"> string> (); Arbiter.Activate (taskQueue, port.Receive ( Console.WriteLine));port.Post ( "Hallo (wieder) Welt");
Hier ist immer etwas los und außerdem lohnt es sich, den Prozess zu verstehen. Die Reichweite von port.Receive() erzeugt den einfachsten Arbiter, den „Empfänger“, und dieser ist mit ziemlicher Sicherheit zufrieden, sobald praktisch jede einzelne Textnachricht am Port ankommt. Ankommen ist der beste Job
Beschleunigen Sie jetzt die Leistung Ihres Computers mit diesem einfachen Download.