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