Domanda

Supponiamo che sto accesso a un DataTable da più thread. Se voglio accedere ad una particolare riga, ho il sospetto che ho bisogno di bloccare tale operazione (potrei essere scambiato su questo, ma almeno so che questo modo sono sicuro):

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

Ma allora, se voglio update che fila, dovrei bloccare la tabella (o meglio, oggetto Rows.SyncRoot della tabella) , o posso semplicemente bloccare la fila?

È stato utile?

Soluzione

In realtà, solo l'esecuzione di un lock in un unico luogo sulla DataTable o DataRow in realtà non do nulla. Un aspetto importante da ricordare nell'utilizzo serrature Monitor (che è ciò che un blocco lock è) è che il blocco di un oggetto non fa nulla ad esso; questo è uno dei motivi che qualche avvocato utilizzando blocco dedicato oggetti piuttosto che bloccare la risorsa stessa, dal momento che ti costringe a rendersi conto che è necessario eseguire il blocco (e sullo stesso oggetto) ogni volta che hai a che fare con la risorsa.

Detto, è una migliore idea per bloccare l'intero DataTable, come dati stessa c'è (oggetti la DataRow internamente contenere solo un offset nel DataTable da dove recuperare i dati). Per questo motivo, anche se si sincronizza l'accesso alle singole righe, aggiornando due diverso righe contemporaneamente causerà di aggiornare lo stesso meccanismo di memorizzazione dei dati in modo non sincronizzato.

C'è un conflitto qui tra la visualizzazione di tipi interne come una "scatola nera" e il blocco solo ciò che è necessario (che, in questo caso, porterebbe a una conclusione errata di un solo blocco della fila) e cercando di ottenere una conoscenza approfondita il funzionamento interno del tipo e basandosi su dettagli di implementazione che potrebbe cambiare .

Il risultato è che, in questo momento, è necessario bloccare l'intero DataTable per evitare di aggiornare il sistema di memorizzazione dati interno in modo non sincronizzato .

Altri suggerimenti

non è necessario per serratura per legge - solo in scrittura / aggiornamenti. bloccare la più piccola quantità che si può, al fine di garantire la coerenza dei dati ... di solito solo quella riga che si sta aggiornando. se si sta aggiornando relazioni padre / figlio tra le tabelle, è necessario bloccare ogni riga in ogni tabella.

La datatable è sicuro solo per il multi filettato operazioni di lettura:

http://msdn.microsoft.com/en -us / library / system.data.datatable.aspx

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

Dopo aver letto circa la DataTable c'è informazioni contrastanti per quanto riguarda la possibilità di bloccare la tavola e consentono di aggiornare in modo sicuro i dati di fila. Secondo il secondo link è possibile bloccare il tavolo e aggiornare la riga. Essendo questo è da un MS MVP, direi che probabilmente si può bloccare la tabella ed essere ok.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top