2014-12-15 4 views
4

C#에서 Powershell 스크립트를 비동기 적으로 실행하려고합니다. BeginInvoke 메서드를 사용했지만 출력/오류를 가져올 수 없습니다. 비록 대리자를 첨부 했는데도 오류가 발생합니다.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 문이 : 여기 내 C# 코드입니다. 그러나 DataAdded 메서드는 실행되지 않습니다. 그러나 동기식 Invoke 메서드를 사용하면 트리거됩니다.

+0

비동기식 'BeginInvoke'와 함께 using 문을 사용할 수 있습니다. 호스트'PowerShell' 객체는 명령 파이프 라인이 완료되기 전에 처리됩니다. –

답변

1

See this answer. 실제로 비동기 적으로 실행하려면 메서드를 비동기로 만들어야합니다. Task.Factory.FromAsync(...)을 호출하여 비동기 작동을 위해 Task<PSObject>을 얻은 다음 await을 사용하면됩니다.

+0

감사합니다. 도움이되었습니다. – Sridhar