我正在尝试学习如何使用运行空间将值传递给 GUI。我一直在调整 Boe Prox 编写的脚本,试图了解 Dispatcher.Invoke 如何与运行空间一起工作,但遇到了一个非常奇怪的问题
$uiHash = [hashtable]::Synchronized(@{})
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState = "STA"
$newRunspace.ThreadOptions = "ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("uiHash",$uiHash)
$psCmd = [PowerShell]::Create().AddScript({
$uiHash.Error = $Error
[xml]$xaml = @"
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Window" Title="Initial Window" WindowStartupLocation = "CenterScreen"
Width = "650" Height = "800" ShowInTaskbar = "True">
<TextBox x:Name = "textbox" Height = "400" Width = "600"/>
</Window>
"@
$reader=(New-Object System.Xml.XmlNodeReader $xaml)
$uiHash.Window=[Windows.Markup.XamlReader]::Load( $reader )
$uiHash.TextBox = $uiHash.window.FindName("textbox")
$uiHash.Window.ShowDialog() | Out-Null
})
$psCmd.Runspace = $newRunspace
$handle = $psCmd.BeginInvoke()
#-----------------------------------------
#Using the Dispatcher to send data from another thread to UI thread
Update-Window -Title ("Services on {0}" -f $Env:Computername)
$uiHash.Window.Dispatcher.invoke("Normal",[action]{$uiHash.TextBox.AppendText('test')})
Update-Window -Title ("Services on {0}" -f $Env:Computername)
如果我在没有you cannot call a method on a null-valued expression.
InvokeMethodOnNull 错误的情况下使用脚本的最后一行,并且不会附加文本。但是,如果我Update-Window -Title ("Services on {0}" -f $Env:Computername)
在 Dispatcher.invoke 行的正上方添加,我仍然会收到错误,但文本框包含附加的文本。
发生这种情况的原因是什么?我已经尝试了很多方法来使用 Dispatcher.Invoke 向文本框添加内容,但总是以cannot call a method method on null
错误告终,但没有任何成功,但现在添加一些引用 UI 的行并调用 Dispatcher.Invoke 似乎可以使它工作。