Schlüsselwort in C # sperren
Verstehe ich die main-Funktion des lock-Taste Wort für MSDN -
lock-Anweisung (C# - Referenz)
Lock-Schlüsselwort kennzeichnet eine Anweisung
block als einen kritischen Abschnitt durch
die Beschaffung der mutual-exclusion lock
für ein bestimmtes Objekt ausführen ein
Anweisung, und dann freigeben
lock.
Wann soll die Sperre verwendet werden?
Beispielsweise macht es Sinn, mit multi-threaded-Anwendungen, da es schützt die Daten. Aber ist es notwendig, wenn die Anwendung nicht das spin-off alle anderen threads?
Gibt es performance-Probleme mit sperren?
Ich habe gerade geerbt eine Anwendung, die Sperre überall, und es ist single-threaded und ich möchte wissen, soll ich Sie verlassen, sind Sie sogar notwendig?
Bitte beachten Sie, dies ist mehr eine Allgemeine wissensfrage, die Anwendung, die Geschwindigkeit ist in Ordnung, ich möchte wissen, ob das ist eine gute design-Muster Folgen in der Zukunft, oder sollte das vermieden werden, es sei denn absolut notwendig.
InformationsquelleAutor der Frage David Basarab | 2008-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Sperre sollte verwendet werden, um schützen Sie freigegebene Ressourcen in Multithread-code. Nicht für irgendetwas anderes.
Absolut nicht. Es ist nur eine Zeitverschwendung. Jedoch sicher sein, dass Sie nicht implizit mit system-threads. Zum Beispiel, wenn Sie die asynchrone I/O erhalten Sie Rückrufe aus einer zufälligen thread, nicht dein ursprünglicher thread.
Ja. Sie sind nicht sehr groß in einem single-threaded-Anwendung, aber warum telefonieren Sie nicht benötigen?
Sperren, alles, wohl oder übel ist eine schreckliche design-Muster. Wenn Ihr code ist unübersichtlich mit willkürlichen sperren und dann müssen Sie sich entscheiden, einen hintergrund-thread für einige Arbeit, die Sie wahrscheinlich zu laufen in deadlocks. Freigeben einer Ressource zwischen mehreren threads erfordert eine sorgfältige Gestaltung, und je mehr Sie sich isolieren, der schwierige Teil ist, desto besser.
InformationsquelleAutor der Antwort Eric
Alle Antworten hier richtig: sperren von' Nützlichkeit ist das sperren von threads aus acessing gesperrt code gleichzeitig. Es gibt jedoch viele Feinheiten in diesem Bereich, ist, dass der gesperrte code-Blöcke werden automatisch markiert als kritischen Regionen von der Common Language Runtime.
Den Effekt der code wird als kritisch gekennzeichnet ist, dass, wenn die gesamte region nicht vollständig ausgeführt, kann die Laufzeit Bedenken Sie, dass Ihre gesamte Anwendungsdomäne ist potenziell gefährdet und daher, entfernen Sie es aus dem Speicher. Zitat MSDN:
Daher, obwohl Ihre Anwendung ist single-threaded, dies kann eine Gefahr für Sie. Bedenken Sie, dass eine Methode in einem gesperrten block eine Ausnahme auslöst, wird schließlich nicht behandelt werden, innerhalb des Blocks. Auch wenn die Ausnahme behandelt wird, wie es sprudelt durch den call-stack, die Ihre kritischen Bereich des Codes nicht fertig, normalerweise. Und wer weiß, wie die CLR reagieren?
Für mehr Infos, Lesen Sie in diesem Artikel auf die Tücken der Thread.Abort().
InformationsquelleAutor der Antwort André Chalella
Bedenken, dass es möglicherweise Gründe, warum Ihre Anwendung nicht als single-threaded als Sie denken. Async I/O in .Kann NET gut call-back auf einen pool-thread, zum Beispiel, wie Sie tun,, einige der verschiedenen timer-Klassen (nicht die Windows Forms Timer, obwohl).
InformationsquelleAutor der Antwort Will Dean
Generell, wenn Ihre Anwendung ist single-threaded, wirst du nicht zu viel Gebrauch von der lock-Anweisung. Nicht zu wissen, Ihre Anwendung genau, ich weiß nicht, ob Sie hilfreich ist oder nicht - aber ich vermute nicht. Weitere, wenn Sie die Anwendung mit lock überall ich weiß nicht, dass ich fühlen würde, dass alle zuversichtlich, dass es in einem multi-Threading-Umgebung sowieso - hatten die ursprünglichen Entwickler eigentlich Kenntnisse in der Entwicklung von multi-threaded code, oder haben Sie nur hinzufügen lock-Anweisungen überall in der vagen Hoffnung, dass würde den trick tun?
InformationsquelleAutor der Antwort John Christensen
Sperre sollte verwendet werden, um den code, der modifiziert gemeinsamen Zustand, Zustand, der geändert wird, durch andere threads gleichzeitig, und die anderen treads müssen die gleiche Sperre.
Einer Sperre ist eigentlich ein memory-access-serializer, die threads (die Sperre) wartet auf die Sperre zu betreten, bis der aktuelle thread beendet wird, die Sperre, so Speicher ist der Zugriff serialisiert.
Beantworten Sie die Frage lock ist nicht erforderlich, in einem single-threaded-Anwendung, und es hat die Leistung Nebenwirkungen. da locks in C# basieren auf kernel sync-Objekte und jedes Schloss das Ihr nehmen schafft einen übergang zu kernel-Modus-user-Modus.
Wenn Sie interessiert sind bei multithreading-Leistung, ein guter Platz zum zu beginnen ist MSDN-threading-Richtlinien
InformationsquelleAutor der Antwort Pop Catalin
Du kann haben performance-Probleme mit sperren von Variablen, aber normalerweise würden Sie bauen Ihre code zu minimieren, die Länge der Zeit, die ausgegeben werden, in einem 'gesperrt' code-block.
So weit wie das entfernen der Schlösser. Es hängt davon ab, was genau der code macht. Auch wenn es single-threaded, wenn Sie Ihr Objekt implementiert ein Singleton, es ist möglich, dass Sie mehrere Kunden haben über eine Instanz (im Speicher auf einem server) zur gleichen Zeit..
InformationsquelleAutor der Antwort Peter Bernier
Ja, es wird einige Leistungseinbußen bei der Verwendung von sperren aber es ist in der Regel vernachlässigbar genug, um keine Rolle.
Verwendung von sperren (oder jede andere mutual-exclusion-Anweisung oder konstruieren), ist im Allgemeinen nur erforderlich, in multi-threaded-Szenarien, in denen mehrere threads (entweder der eigenen Herstellung oder von Ihrem Anrufer) haben die Möglichkeit zur Interaktion mit dem Objekt und ändern Sie die zugrunde liegenden Zustand oder die Daten beibehalten. Zum Beispiel, wenn Sie eine collection zugegriffen werden kann, die von mehreren threads, die Sie nicht wollen, dass ein thread die Veränderung der Inhalte dieser Sammlung durch entfernen eines Elements, während ein anderer thread versucht, es zu Lesen.
InformationsquelleAutor der Antwort Scott Dorman
Lock(token) wird nur verwendet, um markieren Sie einen oder mehrere Blöcke von code, der nicht ausgeführt werden soll, die gleichzeitig in mehreren threads. Wenn Ihre Anwendung ist single-threaded, es schützt gegen einen Zustand, der nicht existieren können.
Und sperren nicht aufrufen eines performance-hit, das hinzufügen von Anweisungen zu überprüfen, für den gleichzeitigen Zugriff, bevor code ausgeführt wird. Es sollte nur verwendet werden, wo es nötig ist.
InformationsquelleAutor der Antwort Yes - that Jake.
Sehen die Frage über 'Mutex' in C#. Und dann schauen Sie diese zwei Fragen in Bezug auf die Verwendung der 'lock(Object)' - Anweisung, die speziell.
InformationsquelleAutor der Antwort Anthony Mastrean
Gibt es keinen Sinn, mit sperren in der app, wenn es ist nur ein thread und ja, es ist ein Leistungseinbruch, auch wenn es noch eine ganze Anzahl von anrufen für die, die schlagen, stapeln sich in etwas bedeutsames.
InformationsquelleAutor der Antwort Quibblesome