C# 如何将这两种方法(异步和非异步)组合为一种?

C# 如何将这两种方法(异步和非异步)组合为一种?,c#,methods,async-await,refactoring,synchronous,C#,Methods,Async Await,Refactoring,Synchronous,我如何将这两种方法结合起来,并将其作为一种 class DataRulesPSScripts { PowerShell ps = PowerShell.Create(); public IEnumerable<object> RunScriptBlock( ScriptBlock scriptBlock, Dictionary<string, object> scriptParameters ) { var vars =

我如何将这两种方法结合起来,并将其作为一种

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;
    }
}
classdatarulespscripts
{
PowerShell ps=PowerShell.Create();
公共IEnumerable RunScriptBlock(ScriptBlock ScriptBlock、字典scriptParameters)
{
var vars=scriptParameters.Select(p=>newpsvariable(p.Key,p.Value)).ToList();
返回scriptBlock.InvokeWithContext(null,vars);
}
公共异步任务CreateScriptBlock(字符串pSScript)
{
ps.AddScript(pSScript);
var scriptBlock=(等待ps.InvokeAsync())[0]。BaseObject作为脚本块;
返回脚本块;
}
}
这两个方法是在不同的类中以类似这样的不同方法调用的。”ds'是类DataRuleSPSScript的对象

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;
}
专用异步任务GenerateValuesFromScript(字典参数,字符串pwScript)
{
var pars=新字典();
部分加上(“"”,arg);
var scriptBlock=await ds.CreateScriptBlock(pwScript);
var results=ds.RunScriptBlock(scriptBlock,pars.ToList();
返回结果;
}
您可以这样写:

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);
}
备选方案:

var items = await ds.CreateAndRunScriptBlock(pwScript, pars);
return items.ToList();
此外,该方法本身也可能直接返回一个列表:

public async Task<List<object>> CreateAndRunScriptBlock(
{
  ...
  return scriptBlock.InvokeWithContext(null, vars).ToList();
}
public异步任务CreateAndRunScriptBlock(
{
...
返回scriptBlock.InvokeWithContext(null,vars.ToList();
}
评论


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

试图找出如何优化它。并使用一个而不是两个方法。如果我这样做,那么我在调用它的第行得到错误,即var results=ds.RunScriptBlock(pwScript,pars).ToList();错误是task不包含.ToList()的定义。它不应该是Taskpublic async task CreateAndRunScriptBlock是的,正如我在评论中提到的那样,它给出了一个错误,即task不包含.ToList()的定义,这可能是一个微不足道的注释,但您是否想过使用System.Collections.Generic?括号中没有错误:)
public async Task<List<object>> CreateAndRunScriptBlock(
{
  ...
  return scriptBlock.InvokeWithContext(null, vars).ToList();
}