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上使用OpenOpenAsync的代码真的不会正确“异步”?

如果我应该在意 - 这种情况下的最佳做法是什么?它看起来不像微软有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

documentation

如果要添加一个TAP方法已包含该方法的名称与Async后缀类,使用后缀TaskAsync代替。例如,如果该类已有GetAsync方法,请使用名称GetTaskAsync

+0

我已阅读命名约定的文档。我的问题是关于处理非等待异步方法的最佳做法。你是否建议通过包装它来让它变得更加适宜? – peteski

+0

您的Web API客户端访问代码不需要基于TAP。它可以是同步的。 –