C# 等待异步函数结束,然后再执行另一个函数

C# 等待异步函数结束,然后再执行另一个函数,c#,.net,C#,.net,我目前正在做一些项目。我需要将一个项目添加到数据库中,然后执行另一个请求以获取我刚才添加的项目。当然,所有操作都必须是非阻塞的,并且当这些操作在后台执行时,用户需要能够仍然使用应用程序 以下是我使用的代码: await AddItem(new Item(...params here ...); return new ItemAdded(await GetItem(id)); 我想在调用GetItem(id)之前等待执行AddItem,因为我需要在获取项目之前将其添加到数据库中。然而,情况似乎并

我目前正在做一些项目。我需要将一个项目添加到数据库中,然后执行另一个请求以获取我刚才添加的项目。当然,所有操作都必须是非阻塞的,并且当这些操作在后台执行时,用户需要能够仍然使用应用程序

以下是我使用的代码:

await AddItem(new Item(...params here ...);
return new ItemAdded(await GetItem(id));
我想在调用
GetItem(id)
之前等待执行
AddItem
,因为我需要在获取项目之前将其添加到数据库中。然而,情况似乎并非如此

我试图将调试消息放入
GetItem
AddItem
函数中,并且
GetItem
开头的消息显示在
AddItem
末尾的消息之前

如何确保在不阻止用户的情况下等待
AddItem
的结束

编辑

附加项

public Task<Item> AddItem(Item item) { 
    return Task.Run(() => { 
        var param = ... params ... 
        _client.Post<string>("/item", param); 
        return item; 
    }); 
}
公共任务附加项(项){
返回任务。运行(()=>{
变量参数=…参数。。。
_客户。Post(“/项”,参数);
退货项目;
}); 
}
GetItem

public Task<Item> GetItem(Guid id)
{
    return Task.Run(() => _client.Get<Item>("/item/" + id));
}
公共任务GetItem(Guid id) { 返回Task.Run(()=>_client.Get(“/item/”+id)); } 职位

公共异步任务Post(字符串路径、字典参数)
{
var response=wait_httpClient.PostAsync(_apirl+path,new FormUrlEncodedContent(参数));
response.EnsureSuccessStatusCode();
var result=await response.Content.ReadAsStringAsync();
返回JsonConvert.DeserializeObject(结果);
}

答案在AddItem方法中。 您应该等待post方法。当您不等待它时,它仍然会执行,但您的代码不会等待它完成并继续运行,因为这种行为GetItem比AddItem工作得更快

public Task<Item> AddItem(Item item) { 
return Task.Run(async () => { 
    var param = ... params ... 
    await _client.Post<string>("/item", param); 
    return item; 
}); 
公共任务附加项(项){
返回Task.Run(异步()=>{
变量参数=…参数。。。
等待_client.Post(“/item”,参数);
退货项目;
}); 
但我认为更好的方法是

public async Task<Item> AddItem(Item item) { 
    var param = ... params ... 
    await _client.Post<string>("/item", param); 
    return item; 
}
公共异步任务附加项(项){
变量参数=…参数。。。
等待_client.Post(“/item”,参数);
退货项目;
}

你需要像这样等待帖子的结果:

await _client.Post<string>("/item", param); 

但是很明显,项目可能没有被添加,因为您调用post并在不等待它完成的情况下立即返回。这里的关键字是may。在某些情况下,当您调用ItemAdded时,它可能已经被添加。

@mybirthname使调用异步并不一定使它们并发。事实上,在上面的示例中,它们已经是连续的。代码应该已经执行了您描述的操作,您能解释一下为什么要这样做吗?
await AddItem
不应该继续执行当前方法,直到
AddItem
完成。您可能需要在
AddItem
中发布代码。在您提供的示例中,
AddItem
将完成在调用
GetItem
之前执行。如果这不是您看到的行为,则需要共享更多代码。以下是附加项代码:公共任务附加项(项项项){return Task.Run(()=>{var param=…params…\u client.Post(“/Item”,param);return item;});}@Pictar共享问题中的完整相关代码。
await _client.Post<string>("/item", param); 
return new ItemAdded(await GetItem(id));