等待异步函数结束后再执行另一个
问题描述:
我目前正在开发一些项目。我需要将一个项目添加到数据库,然后执行另一个请求以获取刚添加的项目。当然,一切都必须是非阻塞的,用户需要能够在后台执行这些操作的同时仍然可以使用该应用程序。等待异步函数结束后再执行另一个
这里是我使用的代码:
await AddItem(new Item(...params here ...);
return new ItemAdded(await GetItem(id));
我想等待AddItem
要执行调用GetItem(id)
之前,因为我需要的项目在数据库中得到它之前加入。但是,似乎并非如此。
我试图把调试信息的GetItem
和AddItem
功能,在邮件内的GetItem
显示开头的消息之前在AddItem
结束。
如何确保在不阻止用户的情况下等待AddItem
的结束?
编辑
的AddItem
public Task<Item> AddItem(Item item) {
return Task.Run(() => {
var param = ... params ...
_client.Post<string>("/item", param);
return item;
});
}
的GetItem
public Task<Item> GetItem(Guid id)
{
return Task.Run(() => _client.Get<Item>("/item/" + id));
}
后
public async Task<T> Post<T>(string path, Dictionary<string, string> parameters)
{
var response = await _httpClient.PostAsync(_apiUrl + path, new FormUrlEncodedContent(parameters));
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result);
}
答
答案就在你的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;
});
更快,但我想这更好的办法执行此
public async Task<Item> AddItem(Item item) {
var param = ... params ...
await _client.Post<string>("/item", param);
return item;
}
答
你需要等待从后这样的结果:
await _client.Post<string>("/item", param);
否则将继续执行到它只是将返回该项目下一线p然后返回到await AddItem(new Item(...params here ...);
,此时该呼叫已被满足并完成。因此,执行将转到下一行是:
return new ItemAdded(await GetItem(id));
但显然未必已添加的项目,因为你所谓的后,回到马上,而无需等待它完成。可能是这里的关键字。在某些情况下,当您调用ItemAdded时,它可能已被添加。
@mybirthname使调用异步并不一定使它们并发。事实上,在上面的例子中,它们已经是连续的。 –
该代码应该已经做你所描述的,你能解释你为什么要问吗?在AddItem完成之前,'await AddItem'不应该继续执行当前的方法。您可能需要在'AddItem'内部发布代码。 –
在你提供的例子中,'AddItem'将在'GetItem'被调用之前完成。如果这不是你所看到的行为,你需要分享更多的代码。 –