我目前正在开展一些项目。我需要将一个项目添加到数据库中,然后执行该操作,执行另一个请求以获取我刚刚添加的项目。当然,一切都必须是非阻塞的,用户需要能够在后台执行这些操作时仍然使用该应用程序。
以下是我使用的代码:
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);
}
答案 0 :(得分:0)
答案在你的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;
}
答案 1 :(得分:0)
你需要等待帖子的结果如下:
await _client.Post<string>("/item", param);
否则执行将继续到下一行,它只返回您传入的项目,然后返回await AddItem(new Item(...params here ...);
,此时该呼叫已经满足并完成。因此,执行将转到下一行:
return new ItemAdded(await GetItem(id));
但显然该项目可能尚未添加,因为您调用了帖子并立即返回而没有等待它完成。 MAY是这里的关键字。在某些情况下,当您调用ItemAdded时,它可能已被添加。