2015-04-18 65 views
2

我有兩個方法,一個在WebApi(Post())和一個在我的數據倉庫(Save())中。在Save方法中,我使用await調用一個異步方法。 Save方法本身是異步的。在WebApi方法中調用異步方法

我到底想要完成的是在Save方法中的函數完成後向用戶發送201。

的Web API:

public HttpResponseMessage Post(JObject input) 
{ 
    Event postedEvent = new Event(// here be data //); 
    IEventRepo repo = new MongoDBRepo(); 

    return repo.Save(postedEvent).Result; 
} 

數據回購:

public async Task<HttpResponseMessage> Save(Event e) 
{ 
    await _collection.InsertOneAsync(e); 

    return new HttpResponseMessage(HttpStatusCode.Created); 
} 

現在會發生什麼情況是,保存會做,但HttpResponseMessage永遠不會發送。所以對服務器的請求將掛起。

+1

當你使用它時,一路使用異步,否則你會陷入僵局。閱讀此:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html –

回答

7

您有一個死鎖,因爲您阻止repo.Save返回Task而不是等待它的結果。

您需要使用async一路攀升到你的控制器動作:

public async Task<HttpResponseMessage> Post(JObject input) 
{ 
    Event postedEvent = new Event(/* here be data */); 
    IEventRepo repo = new MongoDBRepo(); 

    return await repo.Save(postedEvent); 
} 

見這個優秀的blog post這個僵局的原因,但更詳細的解釋 - 在本質 - 它是由引起事實上,repo中的異步調用的延續正在等待請求上下文,該請求上下文已被您調用回購的方法阻止(這反過來等待繼續完成,等等)。

+2

謝謝。就是這樣!我是新來的異步編程,所以原諒我的愚蠢問題:) – andreicek

+0

不錯的一個。我可以看到數據沒有被提交,但身份值正在增加!欣賞提示。 –