2016-11-08 26 views
0

我最近遇到了一個用例,其中由.NET Task-based Asynchronous Pattern (TAP)推薦的「異步」後綴與已經存在的內容衝突。PowerShell System.Management.Automation.Runspaces vs C#中的TAP

我正在處理System.Management.Automation.Runspaces.Runspace在嘗試PowerShell遠程處理過程中執行cmdlet作爲我的應用程序的一部分。

忽略每次想要運行cmdlet時敲除遠程會話的最佳做法(對於企業級應用程序,這可能很多)或創建連接並嘗試維護它在應用程序的生命週期(與重新連接邏輯)...

我的應用程序是基於TAP從WebApi2控制器一直蔓延到後端,我試圖做的是異步打開Runspace連接 - 但注意到已經有一個OpenAsync方法不能等待,並且返回void - 這就像async void(用於事件處理程序),void(非async)和Async後綴之間的一些奇怪的mash-up。

我正在使用Stephen Cleary的Nito.AsyncEx nuget包爲我提供了一個AsyncAutoResetEvent,我可以在嘗試連接/重新連接之前異步等待)。

現在的問題是:我是否應該關心在Runspace上使用OpenOpenAsync的代碼真的不會正確「異步」?

如果我應該在意 - 這種情況下的最佳做法是什麼?它看起來不像微軟有released updated DLLs,它提供了Runspace的等待開放方法。奇怪的是,儘管MS給出關於如何使用這些庫的信息,他們已經加入的nuget site告誡:

版本6.1.7601 *是.NET 4.0非官方的軟件包,並且不支持通過Microsoft 。

似乎還有來自微軟的nuget this DLL-esque package aagggghh!

目前我的計劃是這樣一個類似於:

public async Task<Result> StartAsync() 
{ 
    if (!IsConnected) 
    { 
     try 
     { 
      await _asyncRunspaceLock.WaitAsync(); 
      if (!IsConnected) 
      { 
       var protocol = IsHttpsEnabled ? "https" : "http"; 
       var serverUrl = $"{protocol}://{Fqdn}/OcsPowershell"; 
       var uri = new Uri(serverUrl); 
       var connectionInfo = new WSManConnectionInfo(uri, ShelUri, PSCredential.Empty) 
       { 
        SkipRevocationCheck = true, 
       }; 
       var runspace = runspaceFactory.CreateRunspace(connectionInfo);     
       runspace.OpenAsync(); 
      } 
     } 
     catch (Exception ex) 
     { 
      // TODO: Handle logging the 3rd party exception at the lowest level. 
      return Result.Fail(ex.Message); 
     } 
     finally 
     { 
      _asyncRunspaceLock.Set(); 
     } 
    } 

    return Result.Ok();    
} 

這是一項正在進行的工作,我想同樣的問題圍繞RunspaceFactory的CreateRunspace static method這是不是異步(至少它沒有命名作物起來與異步後綴)。

任何有用的建議或經驗將不勝感激。

感謝

peteski

回答

0

documentation

如果要添加一個TAP方法已包含該方法的名稱與Async後綴類,使用後綴TaskAsync代替。例如,如果該類已有GetAsync方法,請使用名稱GetTaskAsync

+0

我已閱讀命名約定的文檔。我的問題是關於處理非等待異步方法的最佳做法。你是否建議通過包裝它來讓它變得更加適宜? – peteski

+0

您的Web API客戶端訪問代碼不需要基於TAP。它可以是同步的。 –