在执行另一个

时间:2016-11-28 14:12:49

标签: c# .net

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

以下是我使用的代码:

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

2 个答案:

答案 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时,它可能已被添加。