2010-02-15 6 views
5

Quel est le meilleur modèle pour créer des jeux de données threadsafe en écriture? Le meilleur que je peux trouver par googling est 'implémenter une couche d'emballage avec des serrures' mais à première vue cela semble plutôt salissant.Création de jeux de données thread safe en C#

Quelqu'un peut-il me recommander/diriger dans la direction d'une bonne solution à cela? Il semble que ce soit un problème qui a déjà été résolu quelque part. Edit: J'ai aussi besoin de lier l'ensemble de données à une grille d'interface utilisateur, ce qui complique quelque peu les choses.

+0

Désolé, les jeux de données sont en désordre! –

Répondre

3

"Mettre en place une couche d'emballage avec des verrous" est la solution.

La couche d'enveloppe utilisera probablement un verrouillage spécifique à la façon dont votre application utilise les DataSets.

Tenter de concevoir une solution générique pour une classe aussi complexe qu'un DataSet est probablement voué à l'échec. Par exemple, l'énumération des propriétés ne sera généralement pas thread-safe - vous aurez donc besoin de maintenir un verrou tant que n'importe quel appelant énumère l'une des nombreuses propriétés de collection (DataSet.Tables, DataTable.Rows, ..). .).

1

Cela dépend vraiment, énormément, des données en question.

Si vous utilisez des valeurs de type entier ou de référence, le Interlocked class peut être supérieur à la prise de verrous. Sinon, une synchronisation réussie signifie généralement la création d'un verrouillage interne dans la classe.

L'autre alternative, cependant, est de faire en sorte que vos jeux de données principaux fonctionnent sur des types immuables. Vous pouvez ensuite travailler sur des copies dans des threads individuels et fournir uniquement la synchronisation au moment du remplacement des valeurs dans l'ensemble de données principal. Cela évite les verrous dans les copies individuelles par thread.

1

Implémenter une couche wrapper avec des verrous. Sérieusement. Vous ne pouvez pas sous-classer les méthodes importantes, aussi longtemps qu'elles sont disponibles, votre sécurité de thread peut être brisée. Eh bien, vous pouvez également implémenter un ensemble de méthodes d'extension thread-safe et y adhérer, mais cela ne fonctionnera que si vous n'avez pas besoin de passer le DataSet à une bibliothèque tierce qui y accédera directement.