gpt4 book ai didi

c# - 异步函数返回异步元数据(包括结果)而不仅仅是结果

转载 作者:行者123 更新时间:2023-12-03 14:22:18 32 4
gpt4 key购买 nike

我正在使用 .NET Core 3.1 编写 API。这个 API 有一个名为 GetSomeProperty() 的异步函数,我在端点中使用它(称为 Get )。
当收到来自该端点的响应时,results属性被“下移”一层,并包装在来自异步方法的元数据中,如下所示:

"results": [
{
"result": {//actual result here}
"id": 1,
"status": 5,
"isCanceled": false,
"isCompleted": true,
"creationOptions": 0,
"isFaulted": false
},
{
"result": {//actual result here}
"id": 2,
"status": 5,
"isCanceled": false,
"isCompleted": true,
"creationOptions": 0,
"isFaulted": false
}
]
我不希望这些结果被包装在这个“异步”包装器中。
在保持方法异步的同时,如何返回任务结果,而不是包含任务结果的对象?
我没用过的原因有两个 .Result :
  • 使用 .Result被认为是不好的做法,因为如果任务尚未完成,它可能会导致锁定。
  • 我想不出把它放在哪里。据我所知,它似乎不适合任何地方。

  • 这是代码(请记住,出于示例目的,这已被显着稀释和简化):
    [HttpGet]
    public async Task<object> Get(string someParameter)
    {
    //Do stuff

    var things = BuildACollectionOfItems();
    var results = things.Select(x => x.IrrelevantThing).OrderBy(x => x.SomethingIrrelevant).Select(async x =>
    {
    return new
    {
    x.Id,
    SomeProperty = await GetSomeProperty(x.Id)
    };
    }).ToArray();

    return new
    {
    Results = ((IEnumerable<object>) results),
    SomeIrrelevantThing = someIrrelevantThing
    };
    }

    private async Task<bool> GetSomeProperty(int id)
    {
    var somethingFromAServer = (await _thingProvider.GetThing()).TheProperty;

    //Do stuff here

    var thing = _context.Stuff.FirstOrDefault(x => x.Thing == somethingFromAServer);

    //Do some more stuff

    return thing.Stuff;
    }

    最佳答案

    您的 Select返回 IEnumerable<Task> (因为它传递了一个 async 函数);您可以使用 Task.WhenAll等待它们全部完成,然后打开结果:

    [HttpGet]
    public async Task<object> Get(string someParameter)
    {
    //Do stuff

    var things = BuildACollectionOfItems();
    var results = await Task.WhenAll(things
    .Select(x => x.IrrelevantThing)
    .OrderBy(x => x.SomethingIrrelevant)
    .Select(async x => new
    {
    x.Id,
    SomeProperty = await GetSomeProperty(x.Id)
    }));

    return new
    {
    Results = ((IEnumerable<object>) results),
    SomeIrrelevantThing = someIrrelevantThing
    };
    }

    关于c# - 异步函数返回异步元数据(包括结果)而不仅仅是结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62916643/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com