内联 async 和 await 关键字 - 一种在私有异步方法中不拆分代码的编写方式

问题描述 投票:0回答:1

我有以下代码片段。 我正在制作一个本质上是三种方法的任务列表,我想异步调用它们。

我不能在我的 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()”方法中(没有私有方法)。

我会很感激一些建议和指南。 谢谢

c# async-await task-parallel-library .net-6.0
1个回答
0
投票

我相信这就是您要找的:

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)

© www.soinside.com 2019 - 2024. All rights reserved.