线程锁定CollectionViewSource

问题描述:

我添加了一个事件处理程序,我的代码,它打破了所有访问在SystemHTA班说:“因为不同的线程拥有它调用线程不能访问该对象的” CollectionViewSources。当我的课程“this.systemHTA = new SystemHTA();”被放置在DeviceManager_StateChanged()函数的外部。线程锁定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 
     } 
    } 

我最终用ObservableCollection替换CollectionViewSource,一切正常。

这不是关于“螺纹锁固”,但有关公知的问题,即,GUI(或WPF或WinForms的)不是线程并在调试建立有用于跨线程调用活性检查。

因此,您已经知道解决方案:在主线程上创建SystemHTA对象。你的问题可能会转移到从DeviceMgr的东西加载它,你可能不得不在这里使用Control.Dispatcher.Invoke()

+0

我仍然完全困惑如何做到这一点。 – Robert 2010-05-30 21:37:22

+0

我可以想象( - :,这里是一个稍微简单的链接,但请继续搜索:http://msdn.microsoft.com/en-us/magazine/cc163328.aspx – 2010-05-30 22:00:01