Eigentlich nur einen lock
an einem Ort auf der Datatable oder DataRow Durchführung nicht wirklich nichts tun. Ein wichtiger Aspekt bei der Verwendung von Monitor
Sperren (was ein lock
Block ist) ist, dass das Sperren eines Objekts nichts dagegen tut; Das ist ein Grund, warum einige dafür plädieren, dedizierte Sperrobjekte zu verwenden, anstatt die Ressource selbst zu sperren, da sie zwingt, zu erkennen, dass Sie die Sperre (und für dasselbe Objekt) immer dann ausführen müssen, wenn Sie mit der Ressource zu tun haben.
Davon abgesehen, ist es eine bessere Idee, die gesamte DataTable
zu sperren, da der Datenspeicher selbst besteht (die DataRow
Objekte intern nur eine in den DataTable
Offset enthalten, wo die Daten abzurufen). Aus diesem Grund führt die Aktualisierung von zwei verschiedenen Zeilen gleichzeitig dazu, dass Sie denselben Datenspeichermechanismus auf nicht synchronisierte Weise aktualisieren, selbst wenn Sie den Zugriff auf einzelne Zeilen synchronisieren.
Es besteht ein Konflikt zwischen dem Anzeigen interner Typen als "Black Box" und dem Sperren nur der benötigten Informationen (was in diesem Fall zu einer fehlerhaften Schlussfolgerung führen würde, nur die Zeile zu sperren) und versuchen, Einsicht zu gewinnen in die internen Arbeiten des Typs und unter Berufung auf Implementierungsdetails , die ändern könnte.
Das Ergebnis ist, dass Sie jetzt den gesamten DataTable
sperren sollten, um zu vermeiden, das interne Datenspeichersystem in einer nicht synchronisierten Weise zu aktualisieren.
Sehr aufschlussreiche Antwort, und ich kann sehen, warum Sie das Bedürfnis verspürten, darauf hinzuweisen, wie der 'Schloss'-Mechanismus funktioniert ... Ich habe erkannt, dass die Verriegelung nichts zu einem Objekt * macht; Ich denke, eine bessere Art, wie ich meine Frage hätte formulieren können, wäre "Muss ich Update-Operationen pro Zeile oder pro Tabelle synchronisieren?" In jedem Fall ist es für mich an dieser Stelle klar, dass ich Updates auf * any * row über die gesamte Tabelle synchronisieren muss - sei es durch Sperren der Tabelle oder durch eine dedizierte "table lock" (in diesem Fall denke ich, die 'Rows. SyncRoot' Objekt erfüllt diesen Zweck gut, eigentlich). –