none
в каком потоке выполняется InitializeComponent()? RRS feed

  • Вопрос

  • Скажите, а при создании окна в новом потоке, когда выполняется InitializeComponent() этого окна, он (и идущий за ним код) выполняется разве не в этом-же созданном потоке потоке? Я создаю окно указанным ниже способом, а в конструкторе, сразу после InitializeComponent() заполняю Source1 и Source2 данными. Периодически получаю ошибку при попытке добавить элемент в Source1 или Source2, что выполнение происходит не в потоке диспетчера. Отчего так?

     

          Thread t2 = new Thread(() =>
          {
            MyWindow = new MyWindow();
            MyWindow.Show();
            MyWindow.Closed += (sender2, e2) => MyWindow.Dispatcher.InvokeShutdown();
            MyWindow.dgr1.ItemsSource = Source1;
            MyWindow.dgr2.ItemsSource = Source2;
            System.Windows.Threading.Dispatcher.Run();
          });
          t2.IsBackground = true;
          t2.Name = "MyWindow Thread";
          t2.SetApartmentState(ApartmentState.STA);
          t2.Start();
    

    17 ноября 2010 г. 13:12

Ответы

  •  Я создаю окно указанным ниже способом, а в конструкторе, сразу после InitializeComponent() заполняю Source1 и Source2

         А откуда в конструкторе MyWindow известно про Source1 и Source2 ? Конструктор то без параметров или это static public  поля како-го то класса?  

    InitializeComponent() и весь последующий код выполняется в одном потоке, при условии что программист сам не предпримет действий к порождению дополнительных потоков.

    >Периодически получаю ошибку при попытке добавить элемент в Source1 или Source2, что >выполнение происходит не в потоке диспетчера. Отчего так?

    Судя по всему, потому что Source1 и Source2 созданы в главном потоке, а заполняют их в порожденном. Точнее можно сказать, если будет известно какой тип имеют Source

    • Помечено в качестве ответа Qwester33 20 ноября 2010 г. 10:36
    18 ноября 2010 г. 14:41
  • При добавлении элементов в Source  могут вызываться делегаты, которыее ранее были подписаны на события этих объектов. Причем они выполняются в потоке MyWindow Thread.

    Есть ли такие делегаты? Если да, то нет ли в них обращений к функциям главного окна.. или вообще любого другого элемента GUI созданного в главном потоке?

    Возможно ответ даст CallStack на момент исключения

    • Изменено Dron_plane 19 ноября 2010 г. 21:31 добавление
    • Помечено в качестве ответа Qwester33 20 ноября 2010 г. 10:36
    19 ноября 2010 г. 21:30

Все ответы

  •  Я создаю окно указанным ниже способом, а в конструкторе, сразу после InitializeComponent() заполняю Source1 и Source2

         А откуда в конструкторе MyWindow известно про Source1 и Source2 ? Конструктор то без параметров или это static public  поля како-го то класса?  

    InitializeComponent() и весь последующий код выполняется в одном потоке, при условии что программист сам не предпримет действий к порождению дополнительных потоков.

    >Периодически получаю ошибку при попытке добавить элемент в Source1 или Source2, что >выполнение происходит не в потоке диспетчера. Отчего так?

    Судя по всему, потому что Source1 и Source2 созданы в главном потоке, а заполняют их в порожденном. Точнее можно сказать, если будет известно какой тип имеют Source

    • Помечено в качестве ответа Qwester33 20 ноября 2010 г. 10:36
    18 ноября 2010 г. 14:41
  • Source1 и Source2 - тип ObservableCollection

    Source1 и Source2  - это public поля класса, ссылка на экземпляр которого передается в конструктор MyWindow. Эти поля инициализируются при создании экземпляра (содержащего их класса). Создание происходит в главном потоке приложения. А затем из главного потока хочу запустить новый поток, в котором открыть окно MyWindow и привязать гриды этого окна к  Source1 и Source2. Заполнение Source1 и Source2 происходит один раз при инициализации окна, в конструкторе MyWindow, то есть, получается, в потоке содаваемого окна. Оттого мне и непонятно, откуда тут ошибка про поток диспетчера?

    18 ноября 2010 г. 16:53
  • При добавлении элементов в Source  могут вызываться делегаты, которыее ранее были подписаны на события этих объектов. Причем они выполняются в потоке MyWindow Thread.

    Есть ли такие делегаты? Если да, то нет ли в них обращений к функциям главного окна.. или вообще любого другого элемента GUI созданного в главном потоке?

    Возможно ответ даст CallStack на момент исключения

    • Изменено Dron_plane 19 ноября 2010 г. 21:31 добавление
    • Помечено в качестве ответа Qwester33 20 ноября 2010 г. 10:36
    19 ноября 2010 г. 21:30
  • Нет, никаких делегатов нету. Ладно, спасибо, я просто переделал принцип и ошибка пропала.
    • Помечено в качестве ответа Qwester33 20 ноября 2010 г. 10:36
    • Снята пометка об ответе Qwester33 20 ноября 2010 г. 10:36
    20 ноября 2010 г. 10:36