2016-05-15 14 views
2

WebAPI呼び出しによってRavenDbからドキュメントをロードしようとしています。非同期IDocumentSessionを開いてLoadAsyncを呼び出すと、例外も結果もなくなり、スレッドはエラーコードなしで即座に終了します。RavenDb LoadAsyncが返されず、例外をスローされない

APIのすべての構造をバイパスしてエラーを再現できました。ここで

は動作しませんコードです:

public IHttpActionResult GetMyObject(long id) 
    { 
     try 
     { 
      var session = RavenDbStoreHolderSingleton.Store.OpenAsyncSession(); 
      var myObject= session.LoadAsync<MyObject>("MyObject/1").Result; 

      return Ok(myObject); 

     } 
     catch (Exception e) 
     { 
      return InternalServerError(e); 
     } 
    } 

私は単にハードテストのために1にオブジェクトのIDをコード化されたが、(例えば/ MyObjectに」として存在しないオブジェクトのための関数を呼び出します1 ")と同じ結果が得られます。

しかし、このコードは動作します。私が試した

public async Task<IHttpActionResult> GetMyObject(long id) 
    { 
     try 
     { 
      var session = RavenDbStoreHolderSingleton.Store.OpenAsyncSession(); 
      var myObject= await session.LoadAsync<MyObject>("MyObject/1"); 

      return Ok(myObject); 

     } 
     catch (Exception e) 
     { 
      return InternalServerError(e); 
     } 
    } 

物事を/いじっ:

  • 慎重かどうかを確認するためにレイヴンメーカーを監視
  • のデバッグにキャッチされた例外を変更します私は何か問題を見つけることができました(私はしませんでしたが、私は正しい場所を探していたとは確信していません)
  • Runniエラーが発生したか何かがレイヴンStudioで現れた場合には(変更)

は、だから私は、私は「修正」につまずいていると思いませんが、誰かが、なぜ1 説明できるかどうかを確認するためにデバッガをアタッチすることなく、APIをngのそのような奇妙な方法で失敗するでしょうが、他の人は完全にうまくいくでしょうか?実際のアプリケーションで

、APIの呼び出しは非同期/のawaitのペアを持っていなかった、しかしコールが実際に/待つ非同期を使用していた作っていたことをコード。ここで

は私がこの問題を調査するために引き起こされた失敗したリポジトリクラスです:

public async Task<MyObject> Load(string id) 
    { 
     return await _session.LoadAsync<MyObject>(id); 
    } 

答えて

4

デザインごとに、ASP.Net非同期呼び出しのために、あなたがブロックしているとして失敗している最初の部分があります同期コンテキストでは、返されたタスクで結果を呼び出し、データを返すために呼び出しには同じ同期コンテキストが必要です。次のlinkStephen Clearyでチェックしてください。同じメカニズムについて詳しく説明します。

2番目の部分は正しい使い方であり、もうデッドロックに入りません。最初の部分は、同期するコンテキストがブロックされていないコンソールアプリケーションを使用している場合にのみ機能します。winformsにも同様の問題があり、コードの第2部分を使用する必要があります。

+0

デッドロックによって終了するスレッドは、コード0で終了しますか?何らかの問題を示唆する価値はありませんか?これはもうちょっと意味をなさないようになってきています。私はこの話題についてもっと掘り下げなければならないようです。 – Max

+1

デッドロックがないということは、スレッドが終了しないことを意味します。デッドロックが外部で解決されるまで、プロセスを停止し、保持スレッドの1つを強制終了するまで、スレッドは永続的にブロック状態になります。また、デッドロックは例外やエラーを意味するものではないため、エラーコードはありません –

関連する問題