2016-08-29 1 views
0

Sagen Sie zum Beispiel, das ich eine Methode, die einige Daten in eine DateiWie vermeidet man eine Explosion von asynchronen Methoden bei der Einführung einer einfachen Wartezeit?

public void Foo() 
{ 
    using (var file = File.OpenWrite(@"C:\Temp\foo.txt")) 
    { 
     var writer = new StreamWriter(file); 
     writer.WriteLine("foo"); 
     // some other code 
    } 
} 

Dies führt zu einer geringen Menge an Verzögerung schreibt. Ich entscheide mich, es zu beheben, indem ich Asynchronous IO benutze. Ich meine Methode wie folgt ändern:

public async Task FooAsync() 
{ 
    using (var file = File.OpenWrite(@"C:\Temp\foo.txt")) 
    { 
     var writer = new StreamWriter(file); 
     await writer.WriteLineAsync("foo"); 
     // some other code 
    } 
} 

Da async void gesagt wird böse sein, ich ändern den Rückgabetyp Task.

Jetzt in der aufrufenden Methode habe ich eine nicht erwartete Task, die schlecht ist. Also ändere ich die Signatur dieser Methode zu async Task auch. Gleiches gilt für die Eltern dieser Methode. Dann ist diese Methode Teil einer Schnittstelle, die void zurückgeben soll, also ändere ich die Methode in der Schnittstelle, um Task zurückzugeben. Aber es gibt eine andere Implementierung, die nun auch Task zurückgeben muss. Ich repariere das, einige Anrufmethoden, etc.

Jetzt gibt es 20 async Methoden und 2 Stunden Zeit verbracht, alle, weil ich eine einfache asynchrone Datei schreiben wollte.

Wie soll ich das vermeiden? Sollte ich irgendwann einmal auf einen zurückgesandten Task nicht warten? Oder muss ich wirklich alles durchmachen?

+2

die Richtlinie besagt - ** async den ganzen Weg **. Aber möglicherweise ein Overkill –

+3

Wenn Sie das nicht tun, wird Ihre Methode einfach zurückkehren und der Anrufer wird keine Ahnung haben, wenn die Arbeit erledigt ist. Entweder müssen Sie synchron auf das Ergebnis warten (was Ihnen die "Verzögerung" gibt), oder Sie müssen den gesamten Weg async haben. "One simple await" verrät, dass Sie nicht wirklich wissen, was passiert, wenn Sie asynchronen Code verwenden :) Sehen Sie sich an, wie das Gleiche gelöst wurde, bevor "warten" kam und staunen Sie, wie einfach es ist, alle Anrufer zu ändern Asynchron – Luaan

+1

Sie haben den Hauptgrund gefunden, Async nicht zu verwenden. Verwenden Sie, wenn Sie daraus einen spürbaren Nutzen ziehen. – usr

Antwort

2

Dies führt zu einer geringen Verzögerung. Ich entscheide mich, es zu beheben, indem ich Asynchronous IO benutze.

Asynchronous IO macht im Allgemeinen nicht Ihren Code schneller, es verbraucht weniger Ressourcen (insbesondere Threads und damit auch Speicher).

Wenn Sie Ihren Code skalierbarer machen möchten oder wenn Sie den UI-Thread nicht blockieren möchten, hilft Ihnen async. Wenn Sie Ihren Code schneller machen wollen, wird async Ihnen wahrscheinlich überhaupt nicht helfen.

Verwandte Themen