PowerShell System.Management.Automation.Runspaces vs C#中的TAP
我最近遇到了一个用例,其中由.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
如果要添加一个TAP方法已包含该方法的名称与
Async
后缀类,使用后缀TaskAsync
代替。例如,如果该类已有GetAsync
方法,请使用名称GetTaskAsync
。
我已阅读命名约定的文档。我的问题是关于处理非等待异步方法的最佳做法。你是否建议通过包装它来让它变得更加适宜? – peteski
您的Web API客户端访问代码不需要基于TAP。它可以是同步的。 –