2016-05-23 25 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); 

問題は、企業は、まだローカルに保存することができないということですが、この方法は、負荷にしようとしますそれ。私は何とか最初のブロックがダウンロードと保存を完了してから2番目のブロックを実行するまで待たなければなりません。

UIが応答しないため、主要な脅威をフリーズできません。

私はこのようなものが見つかりました:

  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'とは関係ありません。 *別のスレッドからデータをロードしようとしている場合は、アクセスを同期させる必要があります。あるいは単に別のスレッドを使用しない*。メソッドが本当に非同期であれば、UIをブロックしません。おそらく別のスレッドから新しいエンティティを読み込むためにポーリングを使用していますか? –

+0

はい、AsyncManualResetEventやAsyncAutoResetEventのようなものが必要です(最初のリンクにあるものを使用してください)。 2番目のブロックでイベントが発生するのを待ち、最初のブロックが完了した後に信号を設定します。あなたは終わった。 –

+0

投票を終了する。最も簡単な答えは、第2のブロックの実行を許可する前に最初のブロックを「待つ」ことです。または、 'Task'をキャプチャします。または 'AsyncLazy '。または 'SemaphoreSlim'。これらのうちどれが最良であるかを判断するには、より多くのコンテキストが必要です。 –

答えて

-1

[OK]を、ので、私はでそれを行っている:

await Task.Run(); 

そしてRunメソッドで私はasync()=> {my methods}を渡しました。 UIはそれを待っていて、うまく動いています。 私は私の論理を不幸にしている。

AutoResetEventは機能しませんでした。

関連する問題