12

Ich möchte nur einen Aufruf an den SQL Server punt und nicht auf eine Rückkehr warten. Ich habe eine importierte Entity-Funktion aus einer Stored Procedure, die ich in Entity Framework 6.0.0-rc1 asynchron aufrufen möchte. Ist das möglich? Wie lautet die Syntax?Wie starte ich eine gespeicherte Entity-Prozedur in EF6 async und nicht auf eine Rückkehr warten?

Entity Function: RecalculateBudgetNumbers(int id) 
+0

bleiben Sie nicht beim Entity-Framework stecken! Sie können diese Methoden async verwenden, so wie Sie alles andere async verwenden können. (Task.Run, Thread, async (seit 4.5)) – Marguth

Antwort

7

ein neues Task starten, die einen neuen Datenkontext erstellt und ruft diese Funktion. Warten Sie nicht auf diese Aufgabe. Lassen Sie es von selbst bis zur Fertigstellung laufen.

Stellen Sie sicher, dass Fehler protokolliert werden. Schlucke keine Ausnahmen, weil es sich um Fehler handeln könnte, von denen du wissen möchtest.

Beachten Sie in einer ASP.NET-Einstellung, dass der Worker-Prozess jederzeit recycelt werden kann, sodass Ihre Hintergrundarbeit plötzlich verschwinden (oder abgebrochen werden kann).

+0

Ich habe etwas Code hinzugefügt. Wenn ich versuche, in RecalculateBudgetNumbersAsync zu warten, gibt VS eine Warnung aus: Da dieser Aufruf nicht erwartet wird, wird die Ausführung der aktuellen Methode fortgesetzt, bevor der Aufruf abgeschlossen wird. Erwägen Sie, den Operator 'abwarten' auf das Ergebnis des Aufrufs anzuwenden. Wie lasse ich es laufen, ohne auf eine Rückkehr zu warten? – dirq

+0

Sie warten auf die Hintergrundaufgabe, die es natürlich nicht zum Hintergrund macht ... – usr

+1

@usr hat viel Zeit damit verbracht, mein Beispiel mit verschiedenen Versuchen zur Arbeit zu bringen. Meine Async-Anforderungen enthalten das Speichern mit dbcontext. Ihr Kommentar zur Verwendung eines neuen Datenkontextes hat sehr geholfen. thx – user1019042

3

Ahh. Ich war zu lange im Entity Framework Land. Danke für die Tipps. Hier ist, was bei mir funktioniert hat. Sehen Sie irgendwelche Probleme damit?

Und mein Test (ich bin in Visual Studio 2012, so dass ich einen asynchronen Test machen kann).

[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()); 
    } 

Nach Anregungen von Matt Smith und Usr, änderte ich RecalculateBudgetNumbersAsync dazu. Ich hoffe, das ist was sie meinten:

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

Keine Notwendigkeit für die 'async' /' erwarten' Keywords in 'RecalculateBudgetNumbersAsync'. Entfernen Sie sie und Sie haben die gleiche Funktionalität. –

+0

Eine Frage - Wird der primäre Thread freigegeben und ein neuer gestartet, wird die Leistung nicht verringert !? Es scheint einen Overhead zu geben, der den neuen Thread hervorbringt und später wieder auf dem primären Thread startet, wenn der neue fertig ist. Ist es? – sandiejat

Verwandte Themen