Runspace を使用して値を 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 を呼び出すと、うまくいくようです。