【问题标题】:How to combine these two methods (async and non-async) into one?如何将这两种方法(异步和非异步)合二为一?
【发布时间】:2021-05-10 06:53:40
【问题描述】:

我怎样才能将这两种方法结合起来并放在一个...

class DataRulesPSScripts
{
    PowerShell ps = PowerShell.Create();
    
    public IEnumerable<object> RunScriptBlock( ScriptBlock scriptBlock, Dictionary<string, object> scriptParameters )
    {
        var vars = scriptParameters.Select( p => new PSVariable( p.Key, p.Value ) ).ToList();
        return scriptBlock.InvokeWithContext( null, vars );
    }
    
    public async Task<ScriptBlock> CreateScriptBlock( string pSScript )
    {
        ps.AddScript( pSScript );
        var scriptBlock = (await ps.InvokeAsync())[0].BaseObject as ScriptBlock;
        return scriptBlock;
    }
}

这两个方法在不同的类中以不同的方法调用,就像这样。 'ds' 是 DataRulesPSScripts 类的对象

private async Task<IEnumerable<object>> GenerateValuesFromScript( Dictionary<string, EntityProperty> arg, string pwScript )
{
    var pars = new Dictionary<string, object>();
    pars.Add( "_", arg );
    var scriptBlock = await ds.CreateScriptBlock( pwScript );
    var results = ds.RunScriptBlock( scriptBlock, pars ).ToList();
    return results;
}

【问题讨论】:

  • 试图弄清楚我该如何优化这个......并且有一种方法而不是两种方法
  • 如果我这样做了,那么我在调用它的那一行就会出错,即 var results = ds.RunScriptBlock( pwScript, pars ).ToList();并且错误是 task 不包含 .ToList() 的定义

标签: c# methods async-await refactoring synchronous


【解决方案1】:

你可以这样写:

public async Task<IEnumerable<object>> CreateAndRunScriptBlock(
  string pSScript, 
  Dictionary<string, object> scriptParameters)
{
  ps.AddScript(pSScript);
  var scriptBlock = ( await ps.InvokeAsync() )[0].BaseObject as ScriptBlock;
  var vars = scriptParameters.Select(p => new PSVariable(p.Key, p.Value)).ToList();
  return scriptBlock.InvokeWithContext(null, vars);
}

用法:

return ( await ds.CreateAndRunScriptBlock(pwScript, pars) ).ToList();

替代方案:

var items = await ds.CreateAndRunScriptBlock(pwScript, pars);
return items.ToList();

也许方法本身也可以直接返回一个列表:

public async Task<List<object>> CreateAndRunScriptBlock(
{
  ...
  return scriptBlock.InvokeWithContext(null, vars).ToList();
}

备注

GenerateValuesFromScript 返回一个IEnumerable,因此ToList 在理论上是无用的(在这种方法中)。

【讨论】:

  • 应该是Task
  • 公共异步任务> CreateAndRunScriptBlock
  • 是的,我按照 cmets 中提到的那样做了,它给出的错误是 Task 不包含 .toList() 的定义
  • 也许是一句无关紧要的话,但你有没有想过使用 System.Collections.Generic
  • @Olivier List 不包含 GetAwaiter 的定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多