C# PowerShell System.Management.Automation.Runspaces与C中的TAP#
我最近遇到一个用例,.NET推荐的“Async”后缀与已经存在的后缀冲突 在尝试将PowerShell远程处理作为我的应用程序的一部分来执行cmdlet的过程中,我正在处理C# PowerShell System.Management.Automation.Runspaces与C中的TAP#,c#,powershell,asynchronous,async-await,powershell-remoting,C#,Powershell,Asynchronous,Async Await,Powershell Remoting,我最近遇到一个用例,.NET推荐的“Async”后缀与已经存在的后缀冲突 在尝试将PowerShell远程处理作为我的应用程序的一部分来执行cmdlet的过程中,我正在处理System.Management.Automation.Runspaces.Runspace 忽略以下问题:每次运行cmdlet(对于企业级应用程序,这可能会很多)时启动远程处理会话,还是创建连接并尝试在应用程序的生命周期内维护连接(使用重新连接逻辑),这是最佳做法 我的应用程序基于TAP,它从WebApi2控制器一直扩散到
System.Management.Automation.Runspaces.Runspace
忽略以下问题:每次运行cmdlet(对于企业级应用程序,这可能会很多)时启动远程处理会话,还是创建连接并尝试在应用程序的生命周期内维护连接(使用重新连接逻辑),这是最佳做法
我的应用程序基于TAP,它从WebApi2控制器一直扩散到后端,我尝试异步打开一个运行空间
连接,但注意到已经有一个OpenAsync
方法,它不可等待并返回void
——这就像异步void(对于事件处理程序)、void(非异步)和异步后缀之间的某种奇怪的混搭
我正在使用Stephen Cleary的nuget软件包为我提供一个可以在尝试连接/重新连接之前异步等待的接口
问题是:我是否应该关心这样一个事实,即我的代码在使用其中一个或在运行空间上使用时确实不会正确地“异步”
如果我在意的话,在这种情况下,什么是最佳实践?它不像微软那样为运行空间提供了可期待的开放方法。奇怪的是,尽管微软提供了关于如何使用这些库的信息,但他们还是在以下方面添加了警告:
版本6.1.7601.*是.Net 4.0的非官方软件包,不是
由微软支持
似乎还有来自微软的nuget,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();
}
public异步任务StartAsync()
{
如果(!未连接)
{
尝试
{
wait_asyncRunspaceLock.WaitAsync();
如果(!未连接)
{
var protocol=IsHttpsEnabled?“https”:“http”;
var serverUrl=$“{protocol}://{Fqdn}/OcsPowershell”;
var uri=新的uri(serverUrl);
var connectionInfo=新的WSManConnectionInfo(uri、ShelUri、PSCredential.Empty)
{
SkipPreLocationCheck=true,
};
var runspace=runspaceFactory.CreateRunspace(connectionInfo);
OpenAsync();
}
}
捕获(例外情况除外)
{
//TODO:在最低级别处理记录第三方异常。
返回结果失败(例如消息);
}
最后
{
_asyncRunspaceLock.Set();
}
}
返回Result.Ok();
}
这是一项正在进行的工作,我想RunspaceFactory的非异步(至少它没有使用异步后缀命名)也会出现同样的问题
如有任何有用的建议或经验,将不胜感激
谢谢
彼得斯基来自:
如果要将TAP方法添加到已包含该方法名称且后缀为Async
的类中,请改用后缀taskaync
。例如,如果类已经有一个GetAsync
方法,则使用名称GetTaskAsync
从:
如果要将TAP方法添加到已包含该方法名称且后缀为Async
的类中,请改用后缀taskaync
。例如,如果类已经有一个GetAsync
方法,则使用名称GetTaskAsync
我已经阅读了命名约定的文档。我的问题是关于处理不可等待的异步方法的最佳实践。您是否建议尝试通过包装它来让它成为可期待的?您的Web API客户端访问代码不需要基于TAP。它可以是同步的。我已经阅读了命名约定的文档。我的问题是关于处理不可等待的异步方法的最佳实践。您是否建议尝试通过包装它来让它成为可期待的?您的Web API客户端访问代码不需要基于TAP。它可以是同步的。