2010-05-30 2 views
1

J'ai ajouté un gestionnaire d'événement à mon code et il a brisé tous les accès à CollectionViewSources dans la classe SystemHTA en disant "Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède". Ma classe fonctionnait quand "this.systemHTA = new SystemHTA();" a été placé en dehors de la fonction DeviceManager_StateChanged().Thread Locking CollectionViewSource

public partial class MainWindow : Window 
    { 
     private DeviceManager DeviceManager = DeviceManager.Instance; 
     public SystemHTA systemHTA; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      DeviceManager.StateChanged += new EventHandler<DeviceManagerStateChangedEventArgs>(DeviceManager_StateChanged); 
      DeviceManager.Initialize(); 
     } 

     void DeviceManager_StateChanged(object sender, DeviceManagerStateChangedEventArgs e) 
     { 
      if (e.State == DeviceManagerState.Operational) 
      { 
       this.systemHTA = new SystemHTA(); 
      } 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      this.systemHTA.GetViewSourceTest(); 
     } 
    } 


    public class SystemHTA 
    { 
     private CollectionViewSource _deviceTestSource; 

     public SystemHTA() 
     { 
      _deviceTestSource = new CollectionViewSource(); 
      _deviceTestSource.Source = CreateLoadData<HWController>.ControllerCollection; 
     } 

     public void GetViewSourceTest() 
     { 
      ListCollectionView view = (ListCollectionView)_deviceTestSource.View; //This creates an error saying a thread already owns _deviceTestSource 
     } 
    } 

Répondre

1

J'ai fini par remplacer CollectionViewSource par un ObservableCollection et tout fonctionne correctement.

1

Ce n'est pas sur « blocage de filet », mais le problème bien connu qu'un GUI (soit WPF ou WinForms) ne sont pas et dans un thread-safe Debug construire il y a un contrôle actif pour les appels inter-fil.

Donc vous connaissez déjà la solution: créez l'objet SystemHTA sur le thread principal. Il se peut que votre problème se déplace vers le chargement du périphérique DeviceMgr, vous devrez peut-être utiliser Control.Dispatcher.Invoke() ici.

+0

Je suis toujours complètement déconcerté comme comment faire cela. – Robert

+0

Je peux imaginer que (-:, voici un lien un peu plus facile, mais continuez à googler: http://msdn.microsoft.com/fr-fr/magazine/cc163328.aspx –

Questions connexes