2011-02-07 16 views
12

Come si gestisce un DataContext Linq-to_SQL su più thread?DataContext Linq-to-SQL su più thread

Dovrei creare un DataContext statico globale che tutti i thread utilizzano e commettono modifiche alla fine o dovrei creare un Contesto per thread e usare quell'istanza per ogni cosa all'interno di quel thread?

risposta

15

DataContext non è thread-safe; usarlo direttamente da più thread causerebbe #fail; avere un contesto globale di dati statici causerebbe #fail e causerebbe una crescita incontrollata della memoria (il contesto di dati include un gestore di identità e un tracker di modifica per ogni oggetto recuperato, questo solo cresce nel tempo, man mano che vengono toccati più oggetti)

Il contesto dei dati dovrebbe idealmente essere utilizzato per un'unità di lavoro; gira uno su; fare qualcosa (che è limitato in ambito - vale a dire non l'intera durata dell'app) e disporlo. Quindi IMO la vera risposta qui è "legalo a quell'unità di lavoro". Solo tu puoi sapere cosa c'è nella tua applicazione; potrebbe essere un singolo metodo, potrebbe richiedere una pagina su una pagina Web, potrebbe essere un "tick" del timer in un servizio. Chi lo sa ...

+0

Perché non thread-sicuro? MSDN non ha nulla a riguardo o perché. – paIncrease

+1

@ Rancur3p1c "why": perché le raccolte sono * raramente * thread-safe e avere lo stesso contesto parlare sulla stessa connessione più volte in una volta sarebbe un incubo. La consueta dichiarazione di non responsabilità è presente: "Qualsiasi membro statico pubblico (Condiviso in Visual Basic) di questo tipo è sicuro per i thread. Non è garantito che tutti i membri dell'istanza siano thread-safe." vedere http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.aspx –

+0

@Marc Gravell: non thread-safe non equivale a un errore quando si accede da un thread diverso. L'accesso a variabili globali da diversi thread può essere fatto in modo sicuro purché esistano meccanismi di blocco adeguati. Al contrario, l'accesso da thread non UI a elementi dell'interfaccia utente è veramente vietato e causerà eccezioni di runtime. In questi casi è necessario richiamare i thread in background nel thread dell'interfaccia utente. Su quale documentazione basi il tuo reclamo #fail? Perché lo fai sembrare come il caso del filetto dell'interfaccia utente ... – Christoph