Блокировка потоков CollectionViewSource - PullRequest
1 голос
/ 31 мая 2010

Я добавил обработчик событий в свой код, и он прервал весь доступ к CollectionViewSources в классе SystemHTA, сказав: «Вызывающий поток не может получить доступ к этому объекту, поскольку он принадлежит другому потоку». Мой класс работал, когда "this.systemHTA = new SystemHTA ();" был размещен вне функции DeviceManager_StateChanged ().

    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
        }
    }

Ответы [ 2 ]

1 голос
/ 31 мая 2010

Я закончил тем, что заменил CollectionViewSource на ObservableCollection, и все работает отлично.

1 голос
/ 31 мая 2010

Речь идет не о «блокировке потока», а об хорошо известной проблеме, заключающейся в том, что графический интерфейс пользователя (либо WPF, либо WinForms) не является потокобезопасным, и в сборке отладки активная проверка для вызовов между потоками.

Итак, вы уже знаете решение: создайте объект SystemHTA в главном потоке. Ваша проблема может перейти к загрузке из DeviceMgr, возможно, вам придется использовать Control.Dispatcher.Invoke () здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...