为什么我无法处置Runspace?

洛里甘人

因为我的雇主不想使用编译的软件,所以他们要求我创建一个GUI,以使用PowerShell并行ping一系列设备。我的PowerShell脚本由一个ping设备上的一个Form和一个Button组成。为了防止GUI锁定,我使用运行空间将ping操作卸载到单独的线程。我能够ping设备并使用Runspace中的信息更新Form,但是当我完成应用程序后,我无法关闭/处置Runspace,因此即使在应用程序退出后,Runspace仍能继续运行。

下面提供的功能ping localhost十次,并将结果添加到GUI中的ListView。

Function PingDevices
{
    Write-Host "Pinging Devices"
    $items = $StorePingInfo_ListView.Items
    $ScriptBlock = 
    {
        $a = 0
        for(;$a -lt 10; $a++)
        {
            $PingResult = Test-Connection 127.0.0.1 -Count 1
            #[System.Windows.Forms.MessageBox]::Show($PingResult)
            $items.Add("Name").SubItems.Add($PingResult)
            sleep 1
        }
    }
    $runspace = [RunspaceFactory]::CreateRunspace()
    $runspace.Open()
    $runspace.SessionStateProxy.SetVariable('Items',$items)

    $powershell = [System.Management.Automation.PowerShell]::create()
    $powershell.Runspace = $runspace
    $powershell.AddScript($ScriptBlock)
    $AsyncHandle = $powershell.BeginInvoke()

}

Function CleanupResources
{
    #When I try to clean up the resources I get Null errors
    Write-Host "AsyncHandle is Null = "($AsyncHandle -eq $null)
    $data = $powershell.EndInvoke($AsyncHandle)
    $powershell.Dispose()
    $runspace.Close()
}

关闭应用程序时出现的错误是

ping设备
AsyncHandle为Null = True
您不能在空值表达式上调用方法。
在C:\ Users \ Loligans \ Drive \ dboardscript.ps1:673 char:5
+ $ data = $ powershell.EndInvoke($ AsyncHandle)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo:InvalidOperation:(:) [],RuntimeException
    + FullyQualifiedErrorId:InvokeMethodOnNull

您不能在空值表达式上调用方法。
在C:\ Users \ Loligans \ Drive \ dboardscript.ps1:674 char:5
+ $ powershell.Dispose()
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo:InvalidOperation:(:) [],RuntimeException
    + FullyQualifiedErrorId:InvokeMethodOnNull

您不能在空值表达式上调用方法。
在C:\ Users \ Loligans \ Drive \ dboardscript.ps1:675 char:5
+ $ runspace.Close()
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo:InvalidOperation:(:) [],RuntimeException
    + FullyQualifiedErrorId:InvokeMethodOnNull

我认为该问题正在发生,因为运行空间正在执行,但是在运行空间未运行时也会发生。但是,当它们全部耦合到同一个函数中时,它将成功关闭且没有错误

Function PingDevices
{
    Write-Host "Pinging Devices"
    $items = $StorePingInfo_ListView.Items
    $ScriptBlock = 
    {
        $a = 0
        for(;$a -lt 10; $a++)
        {
            $PingResult = Test-Connection 127.0.0.1 -Count 1
            #[System.Windows.Forms.MessageBox]::Show($PingResult)
            $items.Add("Name").SubItems.Add($PingResult)
            sleep 1
        }
    }
    $runspace = [RunspaceFactory]::CreateRunspace()
    $runspace.Open()
    $runspace.SessionStateProxy.SetVariable('Items',$items)

    $powershell = [System.Management.Automation.PowerShell]::create()
    $powershell.Runspace = $runspace
    $powershell.AddScript($ScriptBlock)
    $AsyncHandle = $powershell.BeginInvoke()
    $data = $powershell.EndInvoke($AsyncHandle)
    $powershell.Dispose()
    $runspace.Close()
}

如何获得运行空间以释放其驻留的同一功能之外的所有资源?

安斯加·威彻斯(Ansgar Wiechers)

$powershell最有可能不是全局变量,因此您有2个不同的变量$powershell,一个在函数的上下文中填充PingDevices(),另一个(空)在函数的上下文中填充CleanupResources()使用scope修饰符更改变量的范围,以避免出现这种情况:($script:powershell$global:powershell)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么即使释放/处置位图,我也会得到OutOfMemoryException?

来自分类Dev

为什么即使释放/处置位图,我也会得到OutOfMemoryException?

来自分类Dev

为什么我的数据库上下文被处置

来自分类Dev

为什么此HttpClient用法给我一个“无法访问已处置的对象”的信息。错误?

来自分类Dev

C#实现处置-为什么需要检查处置?

来自分类Dev

为什么代码分析会在这里告诉我“不要多次处置对象”:

来自分类Dev

为什么我们仍然可以使用已处置的对象?

来自分类Dev

为什么代码分析会在这里告诉我“不要多次处置对象”:

来自分类Dev

为什么Mutex在处置时不被释放?

来自分类Dev

为什么在 C# 中的 Powershell 脚本中使用 Runspace

来自分类Dev

为什么我的宏变量无法解析?

来自分类Dev

为什么我无法设置minSdkVersion

来自分类Dev

为什么流无法识别我的类型?

来自分类Dev

为什么scanf无法读取我的输入?

来自分类Dev

为什么Nginx无法启动我的服务?

来自分类Dev

为什么我无法清除setInterval?

来自分类Dev

为什么JQuery无法加载我的脚本?

来自分类Dev

为什么我的UIView无法加载?

来自分类Dev

为什么我的代码无法添加活动?

来自分类Dev

为什么我的JavaFX Tableview无法编辑?

来自分类Dev

为什么我的vfl无法运作?

来自分类Dev

为什么我的__clone()无法正常工作?

来自分类Dev

为什么我的ViewBag无法正常工作?

来自分类Dev

为什么我的UISegmentedControl的顶部无法点击?

来自分类Dev

为什么我的DATEPART无法正常工作?

来自分类Dev

为什么我的scrollHorizontally无法使用?

来自分类Dev

为什么我无法打开VS项目

来自分类Dev

为什么我的char *无法正确通过?

来自分类Dev

为什么我无法索引到ExpandoObject?

Related 相关文章

  1. 1

    为什么即使释放/处置位图,我也会得到OutOfMemoryException?

  2. 2

    为什么即使释放/处置位图,我也会得到OutOfMemoryException?

  3. 3

    为什么我的数据库上下文被处置

  4. 4

    为什么此HttpClient用法给我一个“无法访问已处置的对象”的信息。错误?

  5. 5

    C#实现处置-为什么需要检查处置?

  6. 6

    为什么代码分析会在这里告诉我“不要多次处置对象”:

  7. 7

    为什么我们仍然可以使用已处置的对象?

  8. 8

    为什么代码分析会在这里告诉我“不要多次处置对象”:

  9. 9

    为什么Mutex在处置时不被释放?

  10. 10

    为什么在 C# 中的 Powershell 脚本中使用 Runspace

  11. 11

    为什么我的宏变量无法解析?

  12. 12

    为什么我无法设置minSdkVersion

  13. 13

    为什么流无法识别我的类型?

  14. 14

    为什么scanf无法读取我的输入?

  15. 15

    为什么Nginx无法启动我的服务?

  16. 16

    为什么我无法清除setInterval?

  17. 17

    为什么JQuery无法加载我的脚本?

  18. 18

    为什么我的UIView无法加载?

  19. 19

    为什么我的代码无法添加活动?

  20. 20

    为什么我的JavaFX Tableview无法编辑?

  21. 21

    为什么我的vfl无法运作?

  22. 22

    为什么我的__clone()无法正常工作?

  23. 23

    为什么我的ViewBag无法正常工作?

  24. 24

    为什么我的UISegmentedControl的顶部无法点击?

  25. 25

    为什么我的DATEPART无法正常工作?

  26. 26

    为什么我的scrollHorizontally无法使用?

  27. 27

    为什么我无法打开VS项目

  28. 28

    为什么我的char *无法正确通过?

  29. 29

    为什么我无法索引到ExpandoObject?

热门标签

归档