簡體   English   中英

如何將這兩種方法(異步和非異步)合二為一?

[英]How to combine these two methods (async and non-async) into one?

我怎樣才能將這兩種方法結合起來並放在一起......

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;
    }
}

這兩種方法在不同的 class 中以不同的方法調用。 'ds' 是 object 用於 class 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;
}

你可以這樣寫:

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在理論上是無用的(在此方法中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM