2017-07-03 175 views
12

這可能是一個非常愚蠢的問題,但我有編碼的以下行是轉換RAW圖像BitmapImages:異步任務VS異步無效

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

調用該方法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; 
} 

當在我的CreateImageThumbnails方法中使用async Void而不是async Task時,我的應用程序處理圖像(其中29個)比async Task快11秒。爲什麼會這樣?

異步無效 async void

異步任務 async task

的內存使用情況是使用void得多,但操作完成更快。我對線程知之甚少,這就是爲什麼我問這個問題。有人可以解釋爲什麼會發生這種情況嗎?

此外,我已經做了一些研究,何時何時不使用async void,但我無法找到我的問題的答案。 (我可能沒有很好地搜索)。

謝謝。

+1

也許這將有助於:https://stackoverflow.com/questions/12144077 –

+0

'異步無效'是火和遺忘,所以沒有任何人跟蹤異步操作(或者甚至確保它完全運行),而'異步任務'實際上保持了一個可以等待的軌道。 – poke

+0

當您使用任務時,您是否在等待任務? – Magnus

回答

6

當您調用async void方法,或者在不等待它的情況下調用async Task方法時,代碼將立即繼續,而不用等待方法實際完成。這意味着該方法的多次調用可並行執行,但您不知道它們何時實際完成,通常您需要知道。

你可以在這樣的並行執行的優勢,同時還能夠等到所有的調用由集合在存儲Task秒,然後用await Task.WhenAll(tasks);完成。

另外請記住,如果你想並行執行代碼,你必須確保它是安全的。這通常被稱爲「線程安全」。