2017-07-03 3 views
12

Dies könnte eine sehr dumme Frage, aber ich habe die folgenden Zeilen der Codierung, die RAW-Bilder BitmapImages konvertieren:async Aufgabe vs async Leere

public async void CreateImageThumbnails(string imagePath, int imgId) 
{ 
    await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath)); 
} 

, die diese Methode aufruft CreateThumbnail()

public static BitmapImage CreateThumbnail(string imagePath) 
{ 
    var bitmap = new BitmapImage(); 

    using (var stream = new FileStream(imagePath, FileMode.Open, FileAccess.Read)) 
    { 
     bitmap.BeginInit(); 
     bitmap.DecodePixelWidth = 283; 
     bitmap.CacheOption = BitmapCacheOption.OnLoad; 
     bitmap.StreamSource = stream; 
     bitmap.EndInit(); 
    } 

    bitmap.Freeze(); 

    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 

    return bitmap; 
} 

wenn async Void statt async Task in meiner CreateImageThumbnails Methode verarbeitet meine Anwendung die Bilder (29 von ihnen) etwa 11 Sekunden schneller als async Task. Warum sollte das sein?

async Leere async void

async Aufgabe async task

Der Speicherverbrauch ist viel mehr void verwenden, aber die Operation ist viel schneller abgeschlossen. Ich habe wenig Ahnung von Threading, deshalb stelle ich diese Frage. Kann jemand bitte erklären, warum das passiert?

Auch habe ich einige der Forschung getan auf, wenn und wann nicht async void zu verwenden, aber ich konnte keine Antwort auf meine Frage finden. (Ich hätte vielleicht nicht sehr gut gesucht).

Vielen Dank.

+1

Vielleicht wird dies helfen: https://stackoverflow.com/questions/12144077 –

+0

'async void' ist Feuer und vergessen, also nichts hält von dem Asynchron-Betrieb Spur (oder sogar stellt sicher, dass es vollständig ausgeführt wird), während' async Task "hält tatsächlich eine Spur, auf die man warten kann. – poke

+0

Warten Sie auf die Aufgabe, wenn Sie Task verwenden? – Magnus

Antwort

6

Wenn Sie eine async void Methode aufrufen oder eine async Task Methode aufrufen, ohne warten auf sie, wird Ihr Code sofort weiter, ohne tatsächlich vollständig für das Verfahren zu warten. Das bedeutet, dass mehrere Anrufungen des Verfahrens sein kann parallel ausgeführt wird, aber Sie werden nicht wissen, wann sie tatsächlich abgeschlossen ist, was Sie in der Regel wissen müssen.

Sie können die Vorteile der Ausführung parallel wie diese nehmen, aber auch alle in der Lage zu warten, bis die Anrufungen von Speichern der Task s in einer Sammlung und dann mit await Task.WhenAll(tasks); abzuschließen.

Denken Sie auch daran, dass, wenn Sie Code parallel ausführen wollen, müssen Sie sicherstellen, dass es sicher ist, es zu tun. Dies wird allgemein als "Fadensicherheit" bezeichnet.