我有以下代码片段。 我正在制作一个本质上是三种方法的任务列表,我想异步调用它们。
我不能在我的 DataAgent 类的方法中添加 async 关键字,因为该类有其他调用者。
我正在努力避免制作三个私有方法,我已经在里面添加了异步和等待。
public MyResult AsynchronousCall()
{
var dataAgent = new DataAgent();
const string key = "0101009";
const string customerId = "010101-021";
var tasks = new List<Task<MyResult>>
{
GetMyResultOne(dataAgent, key),
GetMyResultTwo(dataAgent, key),
GetMyResultThree(dataAgent, customerId, key)
};
var myResult = new MyResult
{
ResultOne = tasks[0].Result.One,
ResultTwo = tasks[1].Result.Two,
ResultThree = tasks[2].Result.Three
};
return myResult;
}
private async Task<MyResult> GetMyResultOne(DataAgent dataAgent, string customerId, string key)
{
return await Task.Run(() => dataAgent.GetMyResultOne(customerId, key));
}
private async Task<MyResult> GetMyResultTwo(DataAgent dataAgent, string key)
{
return await Task.Run(() => dataAgent.GetMyResultTwo(key));
}
private async Task<MyResult> GetMyResultThree(DataAgent dataAgent, string key)
{
return await Task.Run(() => dataAgent.GetMyResultThree(key));
}
有内联的写法吗?也许在我的任务列表中?此外,我不喜欢将 dataAgent 解析为参数,所以我真的希望我可以将所有内容保存在一个方法中,因此在“AsynchronousCall()”方法中(没有私有方法)。
我会很感激一些建议和指南。 谢谢
我相信这就是您要找的:
public async Task<MyResult> AsynchronousCall()
{
var dataAgent = new DataAgent();
const string key = "0101009";
const string customerId = "010101-021";
var myResult = new MyResult
{
ResultOne = (await Task.Run(() => dataAgent.GetMyResultOne(key))).One,
ResultTwo = (await Task.Run(() => dataAgent.GetMyResultTwo(key))).Two,
ResultThree = (await Task.Run(() => dataAgent.GetMyResultThree(customerId, key))).Three
};
return myResult;
}
可以将整个await操作包裹在括号中,然后得到异步调用的结果。 但是,这需要您使
AsynchronousCall()
方法异步(用 async
关键字标记)返回 Task<MyResult>
而不是 MyResult
以便它可以异步运行。您示例中的代码同步运行,等待每个任务的 Result
对象。
另请注意,如果您不想将每个
DataAgent
调用包装到 Task.Run()
调用中,您可以为 DataAgent
类中的方法创建异步重载。例如:
public MyResult GetMyResultOne(string key)
{
// do stuff and
// return MyResult object;
}
public async Task<MyResult> GetMyResultOneAsync(string key)
{
return await Task.Run(() => GetMyResultOne(key));
}
这样你就可以在需要的地方简单地等待
GetMyResultOneAsync(key)
。