2017-01-19 7 views
3

レポートを作成するとき、同じコンテキストの分離されたエンティティを含む3つのクエリを実行する必要があります。彼らは非常に重いので、私はそれらを平行して実行するために.ToListAsync();を使用することに決めましたが、私の驚いたことに、私はそれから例外を取得します...EF 6 - パラレルクエリを正しく実行する方法

クエリを実行する正しい方法EF 6を使って並列?手動で新しいタスクを開始する必要がありますか?

編集1
コード問題は、このされ、基本的に

using(var MyCtx = new MyCtx()) 
{ 
     var r1 = MyCtx.E1.Where(bla bla bla).ToListAsync(); 
     var r2 = MyCtx.E2.Where(ble ble ble).ToListAsync(); 
     var r3 = MyCtx.E3.Where(ble ble ble).ToListAsync(); 
     Task.WhenAll(r1,r2,r3); 
     DoSomething(r1.Result, r2.Result, r3.Result); 
} 
+0

可能な重複[EFデータコンテキスト - 非同期/待つ&マルチスレッド](のhttp:// /image/gif/paws/9707/cp-text-context-async-weit-multithreading) –

+0

ちょっとしたヒント。 linqクエリでAsNoQueryableを呼び出すことを忘れないでください。それはパフォーマンスの助けになります –

+0

どのような例外はありますか?どのようにクエリを並行して実行するのか、いくつかのコードを共有できますか? –

答えて

4

ある:

EFが同じDbContextオブジェクトを介して複数の要求を処理して対応していません。最初の要求が完了する前に同じDbContextインスタンスの2番目の非同期要求が開始された場合、その要求は開いているDataReaderに対して処理中であるというエラーメッセージが表示されます。

出典:https://visualstudiomagazine.com/articles/2014/04/01/async-processing.aspx

あなたはこのような何かにあなたのコードを変更する必要があります

async Task<List<E1Entity>> GetE1Data() 
{ 
    using(var MyCtx = new MyCtx()) 
    { 
     return await MyCtx.E1.Where(bla bla bla).ToListAsync(); 
    } 
} 

async Task<List<E2Entity>> GetE2Data() 
{ 
    using(var MyCtx = new MyCtx()) 
    { 
     return await MyCtx.E2.Where(bla bla bla).ToListAsync(); 
    } 
} 

async Task DoSomething() 
{ 
    var t1 = GetE1Data(); 
    var t2 = GetE2Data(); 
    await Task.WhenAll(t1,t2); 
    DoSomething(r1.Result, r2.Result); 
} 
関連する問題