Question

Supposons que j'accès à un DataTable de plusieurs threads. Si je veux accéder à une ligne particulière, je pense que je dois bloquer cette opération (je peux me tromper à ce sujet, mais au moins je sais que cette façon, je suis sûr):

// this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
    row = orderTable.FindByOrderId(myOrderId);
}

Mais alors, si je veux mise à jour cette ligne, dois-je verrouiller la table (ou plutôt l'objet Rows.SyncRoot de la table) nouveau , ou puis-je verrouiller simplement ligne?

Était-ce utile?

La solution

En fait, juste effectuer une lock en un seul endroit sur le DataTable ou DataRow ne fait pas faire quoi que ce soit. Un aspect important de se rappeler à l'aide de verrous de Monitor (qui est ce qu'un bloc de lock est) est que le verrouillage d'un objet ne fait rien pour elle; c'est une raison pour laquelle certains préconisent l'utilisation d'objets de verrouillage dédiés plutôt que le verrouillage de la ressource elle-même, car il vous oblige à se rendre compte que vous devez effectuer la serrure (et sur le même objet) chaque fois que vous avez affaire à la ressource.

Cela étant dit, il est une meilleure idée de bloquer l'ensemble DataTable, comme le stockage de données lui-même est là (les objets DataRow interne ne contiennent un décalage dans le DataTable à l'endroit où récupérer les données). À cause de cela, même si vous synchronisez l'accès à des lignes individuelles, la mise à jour deux différents lignes simultanément vous fera mettre à jour le même mécanisme de stockage de données d'une manière non synchronisée.

Il y a un conflit ici entre l'affichage des types internes comme une « boîte noire » et verrouiller seulement ce que vous devez (qui, dans ce cas, vous conduirait à une conclusion erronée de seulement bloquer la ligne) et d'essayer de mieux comprendre le fonctionnement interne du type et se fondant sur les détails de mise en œuvre qui pourrait changer .

Le résultat est que, en ce moment, vous devez verrouiller l'ensemble DataTable pour éviter la mise à jour du système de stockage de données internes d'une manière non synchronisée .

Autres conseils

vous n'avez pas besoin de verrouiller pour lit - juste pour ecritures / mises à jour. verrouiller la plus petite quantité que vous pouvez, pour assurer la cohérence des données ... habituellement juste une ligne que vous mettez à jour. si vous mettez à jour les relations parent / enfant entre les tables, vous aurez besoin de verrouiller chaque ligne dans chaque tableau.

Le datatable est sûr que pour les opérations de lecture multithread:

http://msdn.microsoft.com/en -nous / bibliothèque / system.data.datatable.aspx

http: / /social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

En train de lire sur le datatable il y a des informations contradictoires concernant la possibilité de verrouiller la table et vous permettent de mettre à jour en toute sécurité des données dans une rangée. Selon le second lien, vous pouvez verrouiller la table et mettre à jour la ligne. Être cela est d'un MS MVP, je dirais que vous pouvez probablement verrouiller la table et être ok.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top