2010-06-25 10 views
0

Je ne sais pas quoi faire pour gérer les _namePrefixes pour ce contrôle. Je sais que je peux le rendre non statique, mais il est logique d'être statique pour être cohérent dans toutes les utilisations de ce contrôle en termes de contenu pour mon projet. En outre, j'ai choisi ObservableCollection en raison du scénario suivant:Comment empêcher l'ajout de valeurs dupliquées dans un thread ObservableCollection statique?

J'ai 2 machines client, une pour une utilisation standard, l'autre pour la gestion des options (admin) comme une liste de préfixes de noms. Si le client est en cours d'exécution et que l'administrateur apporte une modification, le client doit se mettre à jour et refléter ces modifications après qu'il a déjà été chargé. Oh, et parce que c'est un élément WPF et que je veux le cataloguer dans un ListBox. Si aucun de ceux-ci ne me fait utiliser un ObserableCollection, pas de gros problème ... Je vais utiliser quelque chose comme une liste, mais je ne pense pas que cela va changer la question originale.

using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace MyProject 
{ 

    public class NameField : TextBox 
    { 
     private static ObservableCollection<NamePrefix> _namePrefixes; 
     private static ObservableCollection<NameSuffix> _nameSuffixes; 

     static NameField() 
     { 
      _namePrefixes = new ObservableCollection<NamePrefix>(); 
      _nameSuffixes = new ObservableCollection<NameSuffix>(); 
     } 

     public static void AddNamePrefix(Int32 id, String prefix) 
     { 
      //TODO: WHAT DO I DO HERE!? 
     } 

    } 

    /// <summary> 
    /// A Key/Value structure containing a Name Prefix ID and String value. 
    /// </summary> 
    public struct NamePrefix 
    { 
     #region Constructor 

     public NamePrefix(Int32 id, String prefix) 
      : this() 
     { 
      ID = id; 
      Prefix = prefix; 
     } 

     #endregion 

     #region Properties (ID, Prefix) 

     public Int32 ID { get; set; } 
     public String Prefix { get; set; } 

     #endregion 
    } 

    /// <summary> 
    /// A Key/Value structure containing a Name Suffix ID and String value. 
    /// </summary> 
    public struct NameSuffix 
    { 
     #region Constructor 

     public NameSuffix(Int32 id, String suffix) 
      : this() 
     { 
      ID = id; 
      Suffix = suffix; 
     } 

     #endregion 

     #region Properties (ID, Prefix) 

     public Int32 ID { get; set; } 
     public String Suffix { get; set; } 

     #endregion 
    } 
} 
+0

Veuillez ne pas inclure de contenu sans signification (comme des instructions de région vides, ou, honnêtement, des instructions '# region') dans votre code. –

+0

quelle est la question? –

Répondre

2

Si ce que vous cherchez à faire est d'éviter d'ajouter la même instance réelle à la collecte à plusieurs reprises en raison des opérations taraudés se chevauchent, la solution standard pour cela est de faire le travail à l'intérieur d'un bloc lock.

public static void AddNamePrefix(NamePrefix prefix) 
{ 
    lock(_namePrefixes) 
    { 
     if(!_namePrefixes.Contains(prefix)) _namePrefixes.Add(prefix); 
    } 
} 

(et de même pour les suffixes)

serrures sont des ressources à usage unique, de sorte que quand un fil a un verrou sur un objet (dans ce cas, la collecte), puis tout autre fil de tenter de Acquérir le verrou sera bloqué jusqu'à ce que le verrou existant soit libéré. Le résultat dans ce scénario est qu'un seul thread sera en mesure d'exécuter le code à l'intérieur du bloc de verrouillage à un moment donné; tous les autres attendront que le fil en cours se termine, puis continueront un par un.

Il est à noter que l'objet utilisé pour verrouiller n'a rien à voir avec les opérations qui se déroulent à l'intérieur du bloc. Tant que les verrous tentent de verrouiller sur le même objet, cela fonctionnera. Il est courant de déclarer une instance dédiée de type object pour verrouiller, mais dans ce cas, la collection peut servir à cette fin.

+0

Y at-il une chance que 2 demandes d'accès au code à l'intérieur de ce verrou puissent à l'intérieur de ce verrou en quelque sorte? Fondamentalement est-il possible pour les deux fils de se produire simultanément qu'ils activent tous les deux la serrure() en même temps et les deux entrent par accident? –

+0

@myermian: Non, c'est tout le point de la serrure. –