2014-12-15 2 views
4

Я хочу выполнить скрипт Powershell асинхронно на C#. Я использовал метод BeginInvoke, но я не могу получить вывод/ошибки, хотя я добавил делегатов для них. Вот мой C# код:Powershell C# асинхронное выполнение

using(ps=PowerShell.Create()) 
{ 
    PSDataCollection<PSObject> output=new PSDataCollection<PSObject>(); 
    output.DataAdded+=output_DataAdded; 
    ps.AddScript(RenewalScript); 
    SecureString ss = new SecureString(); 
    for (int i = 0; i < Password.Length; i++) 
     ss.AppendChar(Password.ElementAt(i)); 

    PSCredential cred = new PSCredential(Username, ss); 
    ps.AddParameter("Credential", cred); 
    ps.AddParameter("BuildServer", Server); 
    ps.AddParameter("CAServer", CAServer); 
    ps.AddParameter("CAName", CAName); 
    ps.Streams.Error.DataAdded += Error_DataAdded; 
    var result=ps.BeginInvoke<PSObject, PSObject>(null, output); 

} 

void output_DataAdded(object sender, DataAddedEventArgs e) 
{ 
    //display output in UI 
} 

void Error_DataAdded(object sender, DataAddedEventArgs e) 
{ 
    //display error message in UI 
} 

У меня есть несколько Write-Output заявления в моем сценарии. Однако методы DataAdded никогда не запускаются. Но они срабатывают, когда я использую синхронный метод Invoke.

+0

У вас есть инструкция using с асинхронным «BeginInvoke». Хост 'PowerShell' будет удален до завершения конвейера команд. –

ответ

1

See this answer. Чтобы запустить его асинхронно, вам необходимо сделать асинхронный метод. Вы можете сделать это, позвонив Task.Factory.FromAsync(...), чтобы получить Task<PSObject> для асинхронной операции, затем используя await.

+0

Спасибо! Это помогло. – Sridhar

Смежные вопросы