Связь между несколькими потоками в приложении WPF - PullRequest
0 голосов
/ 30 мая 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
        }
    }

Ответы [ 4 ]

0 голосов
/ 30 мая 2010

Простым и стабильным решением для вас является использование BackgroundWorker . Читать эту статью BackgroundWorker

0 голосов
/ 30 мая 2010

Вот пример кода, который решит вашу проблему с помощью Invoke: операция перекрестного потока недопустима . Вам необходимо получить доступ к информации из потока создания.

0 голосов
/ 30 мая 2010

Ладно, производные классы CollectionViewSource, BindableList, ObservableCollection и т. Д. Эти классы могут быть созданы только в основном потоке диспетчера.

Однако вы должны попробовать что-то вроде следующего, Создайте свой collectionviewsource только в своих производных классах WPF, используйте классы List <> для загрузки ваших объектов в другой поток, и после этого вы можете перенести из списка в collectionviewsource, как описано ниже, я бы порекомендовал BindingList, поскольку вы можете добавить несколько элементов, отключив обновление для убрать мерцание.

Создайте свой объект коллекции неявно в ваших классах WPF следующим образом

public class MyWindow : UserControl{
BindingList<MyObject> ObjectList = new BindingList<MyObject>;
    public MyWindow(){
        ObjectList.AllowAdd = true;
        ObjectList.AllowDelete = true;
        ObjectList.AllowEdit = true;
    }
    public void LoadObjects(){
       ThreadPool.QueryUserItem( (s)=>{
           // load your objects in list first in different thread
           List<MyObject> list = MyLongMethodToLoadObjects();
           Dispatcher.BeginInvoke( (Action)delegate(){
               list.RaiseEvents = false;
               foreach(MyObject obj in list){
                   ObjectList.Add(obj);
               }
               list.RaiseEvents = true;
               list.ResetBindings();
           });
       });
    }
}

Я не знаю, что этот код не форматируется правильно, но вы можете попробовать увидеть его в visual studio, чтобы получить правильное представление.

0 голосов
/ 30 мая 2010

То, что вы ищете здесь, это Dispatcher.BeginInvoke. Посмотрите здесь для полного объяснения:

Dispatcher.BeginInvoke

Вот еще одна конкретная помощь, которая поможет вам в этом:

Работа с диспетчером WPF

Удачи.

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