线程锁定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()。
我仍然完全困惑如何做到这一点。 – Robert 2010-05-30 21:37:22
我可以想象( - :,这里是一个稍微简单的链接,但请继续搜索:http://msdn.microsoft.com/en-us/magazine/cc163328.aspx – 2010-05-30 22:00:01