Создание нового окна в фоновом режиме - PullRequest
0 голосов
/ 24 января 2012

Не думаю, что я нашел то, что искал, и не уверен, если это возможно ... Я работал с фоновыми работниками, чтобы выполнять процессы и во время определенных событий "ProgressChanged" извлекать сообщения из фона. рабочий и обновить заданное диалоговое окно. Нет проблем.

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

Start Window
Click Button For Action
Create BackgroundWorker (BGW) and enable progress changed
Link BGW "ProgressChanged" to CurrentWindowCheckProgress method
run BGW process

В BGW, при определенных условиях, я обновляю ход выполнения и на BGW есть флаг, что мне нужно конкретное диалоговое окно X, которое будет показано пользователю. Таким образом, с помощью ReportProgress () выполняется подключение к методу CurrentWindowCheckProgress (который находится в потоке пользовательского интерфейса). Этот метод видит флаг и должен создать новый Window (), получить ответ, затем вернуться к потоку BGW, чтобы продолжить.

Пока что вся логика работает, как и планировалось, но я получаю ошибку

"Вызывающий поток должен быть STA, потому что это требуется для многих компонентов пользовательского интерфейса."

Итак, как / что мне нужно сделать, чтобы показать пользователю мою промежуточную форму "TestPromptWindow".

Это C #, WPF, VS2010, .Net 4.0

Ответы [ 2 ]

1 голос
/ 24 января 2012

Не могли бы вы показать содержание CurrentWindowCheckProgress?Я не уверен, как вы препятствуете работе BackgroundWorker при представлении окна пользователю.Ошибка выглядит так, как будто вы пытаетесь создать некоторый код пользовательского интерфейса в потоке, не являющемся пользовательским интерфейсомЕсли это так, попробуйте вызвать этот фрагмент кода, используя метод Dispatcher.Invoke(...).

0 голосов
/ 24 января 2012

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

В следующем выпуске .net будет очень хорошая поддержка для этого. тем временем вы можете использовать класс Task, особенно его член continueWith. Здесь - хороший пример, показывающий, как переходить назад и вперед в поток пользовательского интерфейса.

...