繁体   English   中英

单击按钮时多运行空间PowerShell / XAML脚本崩溃

[英]Multi-Runspace PowerShell/XAML script crashing on button click

我有一个使用异步运行空间的脚本,以便在后台处理内容时显示XAML / WPF GUI。 当我单击按钮时,它会崩溃,但仅在特定状态下会崩溃。 让我详细说明。

该脚本首先对一长串服务器执行ping操作,以确保它们正常运行。 之后,它会通过几个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}

如果在脚本对所有设备执行ping操作时按下按钮,则效果很好。 如果我在脚本编写过程中的任何其他时间单击按钮,则PS Windows立即翻转为不响应,因此我必须杀死它们。

从应用程序事件日志中:

程序PowerShell_ISE.exe版本10.0.10586.117停止与Windows交互并被关闭。

我想95%肯定是因为ping设备是脚本中与其他窗口的交互绝对为零的唯一部分,我只是不知道如何解决此问题,甚至无法解决它。

我想知道以前是否有人看过或经历过类似的东西,以及您如何解决它。 任何帮助将不胜感激。 谢谢!

我一直无法完全弄清楚这一点,但是我确实找到了一个很好的解决方法。 我将脚本的主要块放入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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM