2016-05-23 210 views
0

我有async方法的問題。我的代碼如下所示:同步異步方法

var bid = await _applicationDataService.GetSnapshotFromServerAsync(b.BidId.ToString(), b.BidVersion); 

if (bid != null) 
{ 
    if (await _bidManagerService.CheckIfBidExistsInLocalDbAsync(bid.BidId, bid.BidVersion)) 
    { 
     await _bidManagerService.OverrideBidInLocalDbAsync(bid); 
    } 
    else 
    { 
     await _bidManagerService.SaveBidInLocalDbAsync(bid); 
    } 
} 

,並在項目中的不同的地方,我有:

await _bidContext.LoadBidByIdAsync(bidId.Value); 

的問題是,該實體還不能在本地保存,但該方法將嘗試加載它。我必須以某種方式等待,直到第一個塊將完成下載和保存,然後我必須運行第二個塊。

我無法凍結主要威脅,因爲用戶界面無法響應。

,我發現這樣的事情:

  1. http://blogs.msdn.com/b/pfxteam/archive/2012/02/11/10266923.aspx

  2. https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

+1

這與'async'無關。如果您嘗試從* another *線程加載數據,則需要同步訪問權限。或者乾脆*不要*使用不同的線程。如果你的方法真的是異步的,他們將不會阻止用戶界面。您是否使用輪詢從另一個線程加載新的實體? –

+0

是的,你需要某種'AsyncManualResetEvent'或者'AsyncAutoResetEvent'(使用第一個鏈接中的那個)。等待第二個程序段中的事件並在第一個程序段完成後設置信號。你完成了。 –

+0

投票結束;最簡單的答案是在允許第二個塊運行之前,只是「等待」第一個塊。或者捕獲「任務」。或'AsyncLazy '。或者「SemaphoreSlim」。需要更多的上下文來確定哪些是最好的。 –

回答

-1

好了,我已經做到了:

await Task.Run(); 

而在Run方法中,我通過了async()=> {my methods}; 用戶界面等待,它工作得很好。 我不得不對我的邏輯。

AutoResetEvent沒有爲我工作。