C# PowerShell System.Management.Automation.Runspaces与C中的TAP#

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控制器一直扩散到

我最近遇到一个用例,.NET推荐的“Async”后缀与已经存在的后缀冲突

在尝试将PowerShell远程处理作为我的应用程序的一部分来执行cmdlet的过程中,我正在处理
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。它可以是同步的。