Я создаю пользовательский плагин для 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 зависает.
Предполагая, что у меня возникла какая-то (перекрестная) проблема с потоками, я попытался подключить несколько различных способов отображения этого простого модального диалога:
- Просто стандартный вызов MessageBox.Show ()
- Если событие кнопки вызывает публичный вызовметод класса TaskSequenceActionControl, который затем просто выполняет MessageBox.Show ()
- Передать дескриптор TaskSequenceActionControl в MessageBox через MessageBox.Show (this, "Test")
Имеютнажатие кнопки порождает новую тему:
new System.Threading.Thread (() => {MessageBox.Show ("Test");}). Start ();
Нажмите кнопку, чтобы отобразить диалоговое окно асинхронно:
ожидайте 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.»