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