2016-03-23 6 views
3

Angenommen, ich habe diese Funktion:C# laichen neue Aufgabe

void DoWork() 
{ 
    //do long work 
} 

Ich mag diese Funktion auf einem anderen Thread ausgeführt werden. Ich bin es gewohnt, Threads zu verwenden, so kann man es auf einem Thread ausgeführt ist:

new Thread(DoWork).Start(); 

Ich versuche, die neue task/await C# Funktion zu erfahren, damit ich die Methode zu

async Task DoWork() 
{ 
    await Task.Run(delegate() { /*do stuff*/}); 
} 
modifizierte

Jetzt kann ich es auf diese Weise verwenden:

DoWork().Wait(0); 

Oder ich kann die Methode modifizieren wieder:

Und jetzt rufen Sie einfach an:

DoWork(); 

Welche Lösung soll ich verwenden? Ich brauche weder das Ergebnis der Aufgabe, noch warte ich auf das Ende.

+0

Ich fand dieses Video ziemlich nützlich: https://www.youtube.com/watch?v=6_GTdR0gBVE –

+1

als Referenz für Wissen http://blog.stephencleary.com/2014/04/a-tour-of -task-part-0-overview.html – Vikas

+1

Wenn Sie das Ergebnis der Aufgabe nicht brauchen noch darauf warten, dass es beendet wird - was ist der Grund für die Verwendung von 'async/aw ait? Sie können die Aufgabe ausführen und vergessen: 'Task.Run (() => {/ * tu stuff * /})'. 'async/await' ist nützlich, wenn Sie nach Abschluss der Aufgabe etwas erledigen müssen. –

Antwort

4

Die Antwort ist weder. Sie erstellen einen trivialen asynchronen Wrapper um synchrone Logik.

Stephen Cleary: using Task.Run for asynchronous wrappers is a code smell

Stephen Toub (Microsoft): Should I expose asynchronous wrappers for synchronous methods? (und nein, sollten Sie nicht).

Der asynchrone Teil Ihrer DoWork Methode fügt keinen Wert hinzu. Es verringert den Wert Ihrer API, indem es unmöglich macht, Ihre potenziell komplexe "Do sachen" Logik in irgendeiner anderen Weise als Feuer-und-vergessen.

Der richtige Ansatz ist Task.Run zu Graben und Ihre Methode Streifen auf das Wesentliche herunter:

void DoWork() 
{ 
    // Do long CPU-bound work, synchronously 
} 

... 

// Then, somewhere in the calling code: 
Task.Run(() => DoWork()); // Fire and forget unless you await the resulting Task or block on it. 

Task.Run ist derzeit die bevorzugte Methode der Planungsarbeiten auf dem Thread-Pool (ab .NET 4.6.x)

+2

+1. Auch wenn Sie * wirklich * Feuer-und-vergessen (das ist * nicht * eigentlich der Fall ') 90% der Zeit * wünscht * für Feuer-und-vergessen haben wollen, können Sie die Warnung vermeiden, indem Sie 'var _ = Aufgabe.Run (() => DoWork()); ' –

Verwandte Themen