Powershell / C#:异步调用管道并显示结果

根据此示例 – http://msdn.microsoft.com/en-us/library/windows/desktop/ee706590(v=vs.85).aspx ,

我试图以异步方式调用我的脚本。 但是,与此同时,我希望在发生的操作集上向GUI提供反馈,即想要在GUI上并行地吐出幕后发生的Write-verbose东西。

我很难实现这一点 – 因为我看到PipelineReader对象上有一个DataReady事件? 有可能以某种方式消耗上面MSDN示例,以便我可以在GUI上显示反馈吗?

从概念上讲,我无法将此示例DataReady事件相关联。

如果您只想将Write-Verbose输出输出到GUI,那么在InvokeAsync之后监视Streams.Verbose集合会更容易。 如果要扫描所有输出,请使用PipelineReader。 订阅其DataReady事件,并在该事件处理程序中执行NonBlockingRead以获取数据。

得到它了 ! 这是完整的代码……

首先在表单上添加Rich Textbox = txtOutput添加 对它 的引用

C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ WindowsPowerShell \ v1.0 \ System.Management.Automation.dll

IAsyncResult _invokeResult; PowerShell _ps = PowerShell.Create(); delegate void SetOutput(string value); // Monitor the DataAdded _ps.Streams.Verbose.DataAdded += new EventHandler(Verbose_DataAdded); var sr = new StreamReader(@"C:\MyScript.ps1"); _ps.AddScript(sr.ReadToEnd()); _invokeResult = _ps.BeginInvoke(null, null, AsyncInvoke, null); void Verbose_DataAdded(object sender, DataAddedEventArgs e) { System.Diagnostics.Debug.Print( ((PSDataCollection) sender)[e.Index].ToString()) ; if (txtOutput.InvokeRequired) { string msg = ((PSDataCollection) sender)[e.Index].ToString(); txtOutput.Invoke(new SetOutput(Execute), new object[] { msg} ); } } void AsyncInvoke(IAsyncResult ar) { // end try { _ps.EndInvoke(ar); } catch (Exception ex) { // do something with the error... } } private void Execute(string msg) { txtOutput.SelectionFont = new Font(txtOutput.SelectionFont.FontFamily, 9.0f); txtOutput.AppendText(msg); txtOutput.ScrollToCaret(); }