Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

EF 6 - So führen Sie parallele Abfragen korrekt durch

Das Problem ist folgendes:

EF unterstützt nicht die Verarbeitung mehrerer Anforderungen über dasselbe DbContext-Objekt. Wenn Ihre zweite asynchrone Anforderung auf derselben DbContext-Instanz beginnt, bevor die erste Anforderung abgeschlossen ist (und das ist der springende Punkt), erhalten Sie eine Fehlermeldung, dass Ihre Anforderung für einen offenen DataReader verarbeitet wird.

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

Sie müssen Ihren Code wie folgt ändern:

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(t1.Result, t2.Result);
}