2016-05-05 8 views
0

Sorry für eine subjektive Frage wie folgt aus:EF Async-Methoden - Best Practices/Verbesserungen

I Strom eine sequentielle Ladeverfahren haben, die extrem langsam war, habe ich das in ein asynchrones Verfahren umgewandelt:

public async void LoadData(int releaseId, int projectId, bool uiThread) 

Innerhalb dieser Methode starte ich eine Warteaufgabe (und setze ConfigureAwait auf false), da sie aus diesem Kontext nicht erfasst und fortgesetzt werden muss.

 await Task.Run(() => 
    { 
     //make several DB calls as below 

    }).ConfigureAwait(False); 

Innerhalb dieser Aufgabe, die ich mehrere Asynchron-Anrufe zu EF/der Datenbank vornehmen, sieht jeder Anruf etwas wie folgt aus:

public async virtual Task<List<X>> FindXAsync() 
    { 
     var q = from c in context.X 
       select c; 
     return await q.ToListAsync(); 
    } 

Aber in der Aufgabe, die ich die Antwort erwarte von Ergebnis unter Verwendung finden Sie unter:

Aus meiner begrenzten Kenntnisse der Verwendung von asynchronen Programmierung mit EF würde jeder Aufruf sequenziell von innerhalb der Aufgabe ausgeführt werden?

Wird die aktuelle Einrichtung gleichzeitig mehrere Rückgabe-Sets zurückgeben oder müsste ich mehrere Aufgaben erstellen und separat warten.

Wieder sorry für die vage Frage, aber ich bin sicher, euch zu diesem Thema viel mehr Erfahrung haben als ich ^^


Edit: Ich lasse es dort nicht wirklich eine richtige Frage war in Ich denke, was ich mich wundere ist, würde x, y und z gleichzeitig oder sequentiell innerhalb der Aufgabe zurückkehren.

 await Task.Run(() => 
    { 
      x = sm.FindXAsync().Result; 

      y = new ObservableCollection<Y>(sm.FindYAsync().Result); 

      z = new ObservableCollection<Z>(sm.FindZAsync().Result); 
    }).ConfigureAwait(False) 

Danke,

Chris

+3

nennen [ Vermeiden Sie 'async void'] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx). – mason

+0

"würde jeder Aufruf sequenziell von innerhalb der Aufgabe ausgeführt werden?" Innerhalb der Aufgabe (wenn Sie nicht synchron absichtlich laufen), ja, wenn Sie auf sie warten. Sie müssen sie nicht in einem anderen Thread mit einem 'Task.Run' ausführen, eine asyc-Methode selbst ist ausreichend. – Transcendent

+0

@Transcendent also eine asynchrone Methode innerhalb der Aufgabe wird auf ihrem eigenen Thread laufen, obwohl das Ergebnis in der Aufgabe erfordert? – Chris

Antwort

1

Ja, die nacheinander ausgeführt werden, wenn Sie das Ergebnis Eigenschaft verwenden. Auch werden sie der Reihe nach mit den folgenden Code ausführen: `

x = await sm.FindXAsync().ConfigureAwait(False); 

    y = new ObservableCollection<Y>(await sm.FindYAsync().ConfigureAwait(False)); 

    z = new ObservableCollection<Z>(await sm.FindZAsync().ConfigureAwait(False)); 

auch

public async void LoadData to return Task -> `public async Task LoadData`. 

aktualisieren Wenn Sie den gesamten Code in parallel fügen Sie die taks in einem Array ausgeführt werden soll und dann await Task.WhenAll(tasks)

+0

so würde ich jede Aufgabe als die Rückkehr der Async-Manager-Methoden erstellen müssen dann Task.WhenAll (Aufgaben) dann die Ergebnisse zu den lokalen Variablen zuweisen? - danke chris – Chris

+0

@Chris, nein, benutze das einfach: var tasks = new Aufgabe [] {sm.FindXAsync(), sm.FindYAsync(), sm.FindZAsync()}; warten auf Task.WhenAll (Aufgaben); x = Aufgaben [0] .Result; y = new ObservableCollection (Aufgaben [1] .Result); z = new ObservableCollection (Aufgaben [2] .Result) –

+0

ok, danke, ich nehme an, die Wartezeit auf die Rückkehr der FindXAsync-Methode hat keinen Einfluss auf die Ausführung der anderen beiden Aufgaben (find y und find z) - markiert als Antwort Danke für Hilfe :) – Chris