Отображение диалога и запуск процесса из TabControl в MDT TaskSequenceAction UserControl приводит к зависанию MDT - PullRequest
0 голосов
/ 12 июля 2019

Я создаю пользовательский плагин для Microsoft Deployment Toolkit (MDT), выводя много из SCCM (SMS) SDK.

Чтобы создать собственный плагин для MDT, я 'm сначала ссылаются на Microsoft.BDD.Actions.dll и Microsoft.BDD.Workbench.dll.После ссылки я могу создать собственное действие последовательности задач, унаследовав его от Microsoft.BDD.Workbench.TaskSequenceActionControl.

Это прекрасно работает;Я получаю пользовательский интерфейс и элементы управления базового класса, и до сих пор разработка шла гладко - пока я не попытался добавить элемент управления Tab в свой пользовательский TaskSequenceActionControl.

Я хочу показать модальные диалоговые окна (File Browser), а также хочувозможность запуска процесса (гиперссылки.) Если я помещаю кнопку Button в свой TaskSequenceActionControl и подключаю его событие к простому методу, чтобы показать базовое модальное диалоговое окно, такое как MessageBox.Show («Testing»), окно сообщения отображается как вы.ожидал.

Однако, если я помещаю элемент управления Tab в TaskSequenceActionControl и помещаю кнопку в одну из панелей элемента управления Tab, и его событие аналогично подключается к тому же простому MessageBox.Show (), когда я нажимаю кнопку, MDT зависает.

Предполагая, что у меня возникла какая-то (перекрестная) проблема с потоками, я попытался подключить несколько различных способов отображения этого простого модального диалога:

  1. Просто стандартный вызов MessageBox.Show ()
  2. Если событие кнопки вызывает публичный вызовметод класса TaskSequenceActionControl, который затем просто выполняет MessageBox.Show ()
  3. Передать дескриптор TaskSequenceActionControl в MessageBox через MessageBox.Show (this, "Test")
  4. Имеютнажатие кнопки порождает новую тему:

    new System.Threading.Thread (() => {MessageBox.Show ("Test");}). Start ();

  5. Нажмите кнопку, чтобы отобразить диалоговое окно асинхронно:

    ожидайте System.Threading.Tasks.Task.Run (async () =>{MessageBox.Show ("Test");});

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

Я сбит с толку, потому что я могу выполнять эти операции вне элемента управления вкладками, но однажды внутри панелиУправление вкладкой, это не удается.

Я несколько летаю в темноте, потому что у MDT нет никакого официального SDK, и поэтому я не уверен, есть ли для меня способ отладить то, что здесь происходит.Я подключился к своему собственному действию последовательности задач через отладчик VS и могу успешно пройти через все, пока не попытаюсь вызвать MessageBox.Show (), после чего отладчик останавливается.

У кого-то есть другие идеи, которые я могупытаться?Возможно, мне не хватает какого-либо способа связать или связать элемент управления Tab и / или его панели с родительским процессом или что-то в этом роде?

Или, возможно, MDT имеет свои собственные пользовательские функции (как часть TaskSequenceActionControl) ииспользовать элемент управления Tab просто невозможно?

EDIT 1:

Я исследовал состояния квартир - MDS TaskSequenceActionControl наследует непосредственно от UserControl, и я не виделничего особенно интересного.Состояние квартиры TaskSequenceActionControl по умолчанию является STA.Попытка отрегулировать состояние квартиры вручную (путем установки [STAThread] или [MTAThread]) над методом, вызывающим MessageBox.ShoW (), не имеет значения;также не порождает отдельную ветку и не указывает состояние квартиры.

Я также создал новую форму просто для того, чтобы попытаться отобразить ее (через .Show ()), что также приводит к зависанию MDT.Я попытался Application.Run (), но это выдает исключение, утверждая, что «Запуск второго цикла сообщений в одном потоке не является допустимой операцией. Вместо этого используйте Form.ShowDialog.»

...