Вопрос по c# – Powershell / C #: асинхронный вызов конвейера и отображение результатов
Согласно этому образцу -http://msdn.microsoft.com/en-us/library/windows/desktop/ee706590(v=vs.85).aspx,
Я пытаюсь вызвать мой сценарий асинхронным способом. Но, в то же время, я хочу дать отзыв графическому интерфейсу пользователя о наборе операций, которые происходят, т. Е. Хочу выплевывать подробные записи, происходящие за кулисами параллельно в графическом интерфейсе.
Я запутался в достижении этого - потому что я вижу, что естьDataReady событие на объекте PipelineReader? Можно ли как-то потреблять этоMSDN sample above такой, что я могу показать отзыв о GUI?
Conceptually, I am not able to relate this sample with the DataReady event.
Если вы хотите вывести только вывод Write-Verbose в GUI, тогда было бы легче контролироватьStreams.Verbose Коллекция после InvokeAsync. Если вы хотите просмотреть все выходные данные, используйте PipelineReader. Подпишитесь на событие DataReady, и в этом обработчике событий выполните NonBlockingRead, чтобы получить данные.
Got it ! Here is the full code...
Add a Rich Textbox = txtOutput on a Form first & Add a reference to
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<DataAddedEventArgs>(Verbose_DataAdded);
var sr = new StreamReader(@"C:\MyScript.ps1");
_ps.AddScript(sr.ReadToEnd());
_invokeResult = _ps.BeginInvoke<PSObject>(null, null, AsyncInvoke, null);
void Verbose_DataAdded(object sender, DataAddedEventArgs e)
{
System.Diagnostics.Debug.Print( ((PSDataCollection<VerboseRecord>) sender)[e.Index].ToString()) ;
if (txtOutput.InvokeRequired)
{
string msg = ((PSDataCollection<VerboseRecord>) 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();
}