Фоновая проблема рабочего - PullRequest
0 голосов
/ 31 марта 2011

У меня есть класс, который при нажатии на определенную часть графического интерфейса

создает фонового работника и выполняет следующие действия:

- создает новый объект (этоэто новая форма окна)

- вызовите метод, который получает некоторые данные

- заполняйте графический интерфейс новой формы окна этими данными

Проблемав форме есть компонент графического интерфейса, который не может быть создан за пределами основного потока программы, если я попытаюсь это сделать, я получу ошибку

Active x .... невозможно создать экземпляр, поскольку текущий потокне в однопоточной квартире.

есть ли помощь, которую люди могут предложить, чтобы я мог структурировать это?

в моей работе

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Не создавайте компоненты графического интерфейса в фоновом потоке. Используйте фоновый поток для получения и обработки данных, а затем визуализируйте их в пользовательском интерфейсе в потоке main . Я знаю, что это неудобно, потому что

  • создание большого количества элементов пользовательского интерфейса также может занять много времени и
  • создание их в потоке пользовательского интерфейса требует от вас разделения кода на часть пользовательского интерфейса и часть обработки данных,

но на самом деле нет способа обойти это. Компоненты .NET UI не предназначены для обработки в фоновых потоках.

Чтобы выполнять только определенные операции вашего кода в основном потоке, вы можете использовать

  • someUIControl.Invoke(...) (WinForms) или
  • Dispatcher.Invoke(...) (WPF)

в обработчике событий DoWork вашего BackgroundWorker. Кроме того, вы можете выполнять операции пользовательского интерфейса в обработчике событий RunWorkerCompleted вашего BackgroundWorker, который всегда выполняется в потоке пользовательского интерфейса.

0 голосов
/ 31 марта 2011

Пользовательский интерфейс должен управляться только потоком пользовательского интерфейса.

Одним из возможных решений будет асинхронная загрузка данных с помощью BackgroundWorker, а когда это будет сделано, используйте свойство Result DoWorkEventArgs, чтобы передать результаты обратно в поток пользовательского интерфейса и затем отобразить новую форму .

...