2016-11-28 174 views
-3

我目前正在开发一些项目。我需要将一个项目添加到数据库,然后执行另一个请求以获取刚添加的项目。当然,一切都必须是非阻塞的,用户需要能够在后台执行这些操作的同时仍然可以使用该应用程序。等待异步函数结束后再执行另一个

这里是我使用的代码:

await AddItem(new Item(...params here ...); 
return new ItemAdded(await GetItem(id)); 

我想等待AddItem要执行调用GetItem(id)之前,因为我需要的项目在数据库中得到它之前加入。但是,似乎并非如此。

我试图把调试信息的GetItemAddItem功能,在邮件内的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); 
} 
+1

@mybirthname使调用异步并不一定使它们并发。事实上,在上面的例子中,它们已经是连续的。 –

+3

该代码应该已经做你所描述的,你能解释你为什么要问吗?在AddItem完成之前,'await AddItem'不应该继续执行当前的方法。您可能需要在'AddItem'内部发布代码。 –

+1

在你提供的例子中,'AddItem'将在'GetItem'被调用之前完成。如果这不是你所看到的行为,你需要分享更多的代码。 –

回答

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; 
} 
0

你需要等待从后这样的结果:

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

否则将继续执行到它只是将返回该项目下一线p然后返回到await AddItem(new Item(...params here ...);,此时该呼叫已被满足并完成。因此,执行将转到下一行是:

return new ItemAdded(await GetItem(id)); 

但显然未必已添加的项目,因为你所谓的后,回到马上,而无需等待它完成。可能是这里的关键字。在某些情况下,当您调用ItemAdded时,它可能已被添加。