【问题标题】:PowerShell System.Management.Automation.Runspaces vs TAP in C#C# 中的 PowerShell System.Management.Automation.Runspaces 与 TAP
【发布时间】:2017-03-22 05:46:12
【问题描述】:

我最近遇到了一个用例,其中 .NET Task-based Asynchronous Pattern (TAP) 推荐的“异步”后缀与已经存在的后缀冲突。

在尝试使用 PowerShell 远程处理将 cmdlet 作为我的应用程序的一部分时,我正在处理 System.Management.Automation.Runspaces.Runspace

忽略有关每次要运行 cmdlet(对于企业级应用程序这可能是很多)或创建连接并尝试维护它的最佳实践是否是最佳实践在应用程序的生命周期内(使用重新连接逻辑)...

我的应用程序基于从 WebApi2 控制器一直扩散到后端的 TAP,我正在尝试做的是异步打开一个 Runspace 连接 - 但注意到已经有一个 OpenAsync 方法不可等待并返回 void - 这就像 async void(用于事件处理程序)、void(非异步)和 Async 后缀之间的一些奇怪的混搭。

我正在使用 Stephen Cleary 的 Nito.AsyncEx nuget 包为我提供一个 AsyncAutoResetEvent,我可以在尝试连接/重新连接之前异步等待。

问题是:在Runspace 上使用OpenOpenAsync 时,我是否应该关心我的代码真的不会正确“异步”?

如果我应该关心 - 这种情况下的最佳做法是什么?微软似乎没有released updated DLLs,它为Runspace 提供了等待打开的方法。奇怪的是,尽管 MS 提供了有关如何使用这些库的信息,但他们在 nuget site 上添加了警告:

版本 6.1.7601.* 是 .Net 4.0 的非官方软件包,不是 微软支持。

在微软的 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 不是异步的(至少它没有以 Async 后缀命名)出现同样的问题。

任何有用的建议或经验将不胜感激。

谢谢

佩特斯基

【问题讨论】:

    标签: c# powershell asynchronous async-await powershell-remoting


    【解决方案1】:

    来自documentation

    如果您将 TAP 方法添加到已包含该方法名称且带有 Async 后缀的类,请改用后缀 TaskAsync。例如,如果该类已经有一个GetAsync 方法,则使用名称GetTaskAsync

    【讨论】:

    • 我已经阅读了有关命名约定的文档。我的问题与处理不可等待的异步方法的最佳实践有关。您是否建议尝试通过包装它来使其可等待?
    • 您的 Web API 客户端访问代码不需要基于 TAP。它可以是同步的。
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多