Сбой сценария Multi-Runspace PowerShell/XAML при нажатии кнопки

У меня есть сценарий, который использует асинхронные пространства выполнения для отображения графического интерфейса XAML/WPF при обработке данных в фоновом режиме. Когда я нажимаю кнопку, он вылетает, но только в определенном состоянии. Позвольте мне уточнить.

Сценарий начинается с проверки связи с длинным списком серверов, чтобы убедиться, что они работают. После этого он выполняет несколько SQL-запросов, вызовов WMI, другой логики, обрабатывает все данные, а затем обновляет мою DataGrid в другом окне по одной строке за раз информацией.

Кнопка просто вызывает подтверждение WinForm:

#$Global:uihash is my synchronized hashtable.

 $Global:uihash.Button.add_click({if([System.Windows.Forms.MessageBox]::Show `
("Yes or No?", "Question",[System.Windows.Forms.MessageBoxButtons]::OKCancel) -eq "OK")

{Do stuff back in main PS Window}

Если я нажму кнопку, пока скрипт пингует все устройства, он работает отлично. Если я нажму кнопку в любое другое время во время выполнения сценария, PS Windows сразу перевернется, чтобы не отвечать, и мне придется их убить.

Из журнала событий приложения:

Программа PowerShell_ISE.exe версии 10.0.10586.117 перестала взаимодействовать с Windows и была закрыта.

Я на 95% уверен, что это потому, что пингование устройств - единственная часть скрипта, которая абсолютно не взаимодействует с другим окном, я просто не знаю, как это исправить или даже обойти это.

Мне интересно, видел ли кто-нибудь или испытал это или что-то подобное раньше, и как вы обошли это. Любая помощь будет принята с благодарностью. Спасибо!


person Nick    schedule 13.06.2017    source источник
comment
Вероятно, связано, если не идентично, с моей проблемой с WinForms "> stackoverflow.com/questions/34451759/   -  person Deadly-Bagel    schedule 14.06.2017


Ответы (1)


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

#$Global:uihash is my synchronized hashtable.

#Create synchronized hash table variable
$Global:uiHash.Add(“End”,$false)

 #Create Click Event 
$Global:uihash.Button.add_click({if([System.Windows.Forms.MessageBox]::Show 
("Yes or No?", "Question",[System.Windows.Forms.MessageBoxButtons]::OKCancel) -eq "OK")
{$Global:uiHash.End = $true}

Do {A whole bunch of stuff}
Until ($global:uiHash.end -eq $true)

#Close the window
$Global:uiHash.Window.Dispatcher.Invoke([action]{$Global:uiHash.Window.close() },"Normal")
#Then process the rest of the script
person Nick    schedule 22.08.2017