簡體   English   中英

異步任務與異步無效

[英]async Task vs async void

這可能是一個非常愚蠢的問題,但我有以下幾行代碼可以將 RAW 圖像轉換為 BitmapImages:

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 秒。 為什么會這樣?

異步無效異步無效

異步任務異步任務

使用void占用的內存更多,但操作完成更快。 我對線程知之甚少,這就是我問這個問題的原因。 有人可以解釋為什么會這樣嗎?

此外,我對何時以及何時不使用async void進行了一些研究,但我找不到我的問題的答案。 (我可能只是沒有很好地搜索)。

謝謝。

當您調用async void方法,或在不等待的情況下調用async Task方法(如果被調用的方法包含await ,則它不會阻塞),您的代碼將立即繼續,無需等待該方法實際完成。 這意味着該方法的多個調用可以並行執行,但您不知道它們何時真正完成,而您通常需要知道這一點。

您可以像這樣利用並行執行,同時還可以通過Task存儲在集合中然后使用await Task.WhenAll(tasks);來等待所有調用完成await Task.WhenAll(tasks); .

還要記住,如果你想並行執行代碼,你必須確保這樣做是安全的。 這通常稱為“線程安全”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM