Вопрос по c# – Powershell / C #: асинхронный вызов конвейера и отображение результатов

0

Согласно этому образцу -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.

Ваш Ответ

2   ответа
1

Если вы хотите вывести только вывод Write-Verbose в GUI, тогда было бы легче контролироватьStreams.Verbose Коллекция после InvokeAsync. Если вы хотите просмотреть все выходные данные, используйте PipelineReader. Подпишитесь на событие DataReady, и в этом обработчике событий выполните NonBlockingRead, чтобы получить данные.

Я попытался использовать Streams.Verbose.DataAdded событие. Это работает нормально - System.Diagnostics.Debug.Print (((PSDataCollection & lt; VerboseRecord & gt;) отправитель) [e.Index] .ToString ()), но когда я пытаюсь показать его в графическом интерфейсе потокобезопасным способом, это просто перестает работать Любой пример того, как отслеживать и отображать результаты в графическом интерфейсе пользователя. форма так же, как мы имеем дело с индикаторами выполнения? Angshuman Agarwal
2

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();
        }
stackoverflow.com/q/9831617/763026 - Может быть, это то, что вы хотели? Но, в любом случае, я скоро попробую. Angshuman Agarwal
какие-либо обновления об этом?
Было бы интересно узнать, как асинхронно вызывать конвейер при удаленном вычислении и отображать результаты, используя PowerShell и C #

Похожие вопросы