我目前正在開發一些項目。我需要將一個項目添加到數據庫,然後執行另一個請求以獲取剛添加的項目。當然,一切都必須是非阻塞的,用戶需要能夠在後臺執行這些操作的同時仍然可以使用該應用程序。等待異步函數結束後再執行另一個
這裏是我使用的代碼:
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);
}
@mybirthname使調用異步並不一定使它們併發。事實上,在上面的例子中,它們已經是連續的。 –
該代碼應該已經做你所描述的,你能解釋你爲什麼要問嗎?在AddItem完成之前,'await AddItem'不應該繼續執行當前的方法。您可能需要在'AddItem'內部發布代碼。 –
在你提供的例子中,'AddItem'將在'GetItem'被調用之前完成。如果這不是你所看到的行爲,你需要分享更多的代碼。 –