我最近遇到了一個用例,其中由.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
上使用Open或OpenAsync的代碼真的不會正確「異步」?
如果我應該在意 - 這種情況下的最佳做法是什麼?它看起來不像微軟有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
我已閱讀命名約定的文檔。我的問題是關於處理非等待異步方法的最佳做法。你是否建議通過包裝它來讓它變得更加適宜? – peteski
您的Web API客戶端訪問代碼不需要基於TAP。它可以是同步的。 –