12

私はSQL Serverへのコールをちょうどパントし、リターンを待つことはしません。私はストアドプロシージャからEntity Framework 6.0.0-rc1でこのように非同期に呼び出すようにしたいと思います。これは可能ですか?構文は何ですか?EF6非同期でエンティティストアドプロシージャを開始し、返品を待つことはできますか?

Entity Function: RecalculateBudgetNumbers(int id) 
+0

はEntity-Frameworkで動かないでください! 他のすべての非同期を使用できるように、これらのメソッドを非同期で使用できます。 (Task.Run、Thread、async(4.5以降)) – Marguth

答えて

7

新しいデータコンテキストを作成し、その関数を呼び出す新しいTaskを開始します。待ってはいけない/その仕事を待っているだけです。それは完了するまでそれ自身を実行してみましょう。

エラーをログに記録してください。あなたが知りたいバグかもしれないので、例外を飲み込まないでください。

ASP.NET設定では、ワーカープロセスはいつでもリサイクルできるため、バックグラウンドの作業が突然消えたりキャンセルされる可能性があることに注意してください。

+0

私はいくつかのコードを追加しました。 RecalculateBudgetNumbersAsyncで待機状態を取り除こうとすると、VSから警告が表示されます。この呼び出しは待機されていないため、呼び出しが完了する前に現在のメソッドの実行が継続されます。呼び出しの結果に 'await'演算子を適用することを検討してください。 返品を待つことなく、どうやって自分自身を稼働させるのですか? – dirq

+0

あなたはバックグラウンドタスクを待っていますが、それはもちろんバックグラウンドではありません。 – usr

+1

@usrは、私の例題を試してみるために多くの時間を費やしました。私の非同期ニーズには、dbcontextを使った保存が含まれていました。新しいデータ・コンテキストを使用するというあなたのコメントは、多くの助けになりました。 thx – user1019042

3

ああ。私はEntity Frameworkの土地が長すぎました。ヒントをありがとう。ここに私のために働いたものです。これに何か問題はありますか?

/// <summary> 
    /// kicks off the LONG RUNNING calculations on a budget to regenerate all pre-cooked numbers. 
    /// </summary> 
    /// <param name="budgetId">Budget Id</param> 
    public async System.Threading.Tasks.Task RecalculateBudgetNumbersAsync(int budgetId) 
    { 
     await System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId)); 
    } 

    public static void RecalculateBudgetNumbers(int budgetId) 
    { 
     //this is static so we don't use the unit of work.. 
     using (BMTContext ctx = new BMTContext()) 
     { 
      ctx.UpdateLifeOfBudgetNumbers(budgetId);     
      ctx.UpdateIntervalNumbers(budgetId);     
      ctx.UpdateIntervalActivityNumbers(budgetId); 
      ctx.UpdateLifeOfBudgetActivityNumbers(budgetId); 
     } 
    } 

私のテスト(私はVisual Studio 2012で、非同期テストを行うことができます)。

[TestMethod] 
    public async System.Threading.Tasks.Task RecalculateBudgetNumbersAsyncTest() 
    { 
     System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); 
     timer.Start(); 
     await repo.RecalculateBudgetNumbersAsync(budgetId); 

     System.Console.WriteLine("RecalculateBudgetNumbersAsyncTest milliseconds: " + timer.ElapsedMilliseconds.ToString()); 
    } 

Matt SmithとUsrの提案を受けて、RecalculateBudgetNumbersAsyncをこれに変更しました。私はこれが彼らが意味していたことを願っています:

public void RecalculateBudgetNumbersAsync(int budgetId) 
    { 
     System.Threading.Tasks.Task.Factory.StartNew(() => RecalculateBudgetNumbers(budgetId)); 
    } 
+1

'RecalculateBudgetNumbersAsync'の' async'/'await'キーワードは必要ありません。それらを削除すれば同等の機能が得られます。 –

+0

1つの質問 - プライマリスレッドをリリースし、新しいものを開始するとパフォーマンスが低下することはありませんか?新しいスレッドが生成されたときに、新しいスレッドを生成して後でプライマリで再開するオーバーヘッドがあるようです。それは...ですか? – sandiejat

関連する問題