2016-07-14 28 views
2

Entity Frameworkは、ストアドプロシージャをDbContextクラスのメソッドとしてインポートします。 しかし、それらは非同期ではなく、スレッドをブロックすることなく、非同期WebApiコントローラから呼び出すことができます。私は非同期ラッパーメソッドを書いていますが、Visual Studioが私に与える警告によって混乱します。同期コードの非同期実行

このコードは非同期で実行されますか?このコールが、私は提案に従っている場合、コールがしかし

を完了する前に、現在のスレッドの実行が続く、待望されていないので

public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) 
    { 
     await Task.Run(() => 
     { 
      //synchronous method generated by EF. 
      //VS warning here 
      AttachTypeToMeetingTime(meetingTimeId, meetingTypeId); 
     }); 
    } 

Visual Studioは、私に警告を与えます赤色で下線が引かれ、コンパイルされません。

呼び出しが完了する前に現在のスレッドを続行しないようにしますか?

+0

サイドノート:私はあなたが何をあなたが実際にだけやろうとしていると、パフォーマンスが低下することを理解してほしい - 代わりにリクエストを処理スレッドプールからスレッドを1つ持つのあなたは今、別のスレッドプールのスレッドに作業をシフトし、コンテキストスイッチ/スレッドを支払います同期(さらにそのスレッドは文化/現在の要求で設定されていないし、後ですべての種類の楽しみを与える) –

+0

@AlexeiLevenkov申し訳ありません、私はそれを前に見てきました。解決セクションをそれ自身の答えに移動しました。私は、非同期コントローラメソッドや、 'FindAsync()'のようなバニラEF非同期メソッドとどう違うのですか? –

+0

真の非同期メソッドはスレッド上でビジー待機を行いません(同期一回と異なります)。 asyncについては、[同期メソッドの非同期ラッパーを公開する必要がありますか?](http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx)の一般的な記事を読んでみてください。出発点。 –

答えて

4

あなたは再帰呼び出しを行っています。私はあなたがそれをするつもりはないと思う。

AttachTypeToMeetingTimeの代わりに、同期メソッドを呼び出す必要があります。

public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) 
{ 
    await Task.Run(() => 
    { 
     SomeMethod(meetingTimeId, meetingTypeId); 
     ^^^^^ 
    }); 
} 
+0

再帰の良いキャッチ – BradleyDotNET

+0

それはタイプミスでした、それをキャッチしていただきありがとうございます。私はその質問を編集した。 –

1

私はメソッド名を間違って呼び出していました。それは次のようになります。

public async Task AttachTypeToMeetingTimeAsync(int meetingTimeId,int meetingTypeId) 
    { 
     await Task.Run(() => 
     { 
      //synchronous method generated by EF. 
      //VS warning here 
      AttachTypeToMeetingTime(meetingTimeId, meetingTypeId); 
     }); 
    } 

生成されたメソッドのシグネチャは

AttachTypeToMeetingTime(int? meetingTimeId,int? meetingTypeId) 

だった私は、メソッドのパラメータは、intたと生成されたメソッドのパラメータは、署名が衝突しないことをint?であったためと考えたが、私視覚スタジオの提案エンジンとの可能性がありますコンパイラをトリップすると思います。

0

下記のコードで「Your」で始まるものを記入してください。

public async Task AttachTypeToMeetingTime(int meetingTimeId,int meetingTypeId) 
{ 
    using(var context = new YourContext()) 
    { 
     await conext.Database.ExecuteSqlCommandAsync("YourStoredProcedureName @YourParam1Name, @YourParam2Name", meetingTimeId, meetingTypeId); 
    } 
}