async Task vs async void

时间:2017-07-03 10:52:51

标签: c# async-await task 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;
}

在我的async Void方法中使用async Task代替CreateImageThumbnails时,我的应用程序处理图像(其中29个)比async Task快约11秒。为什么会这样?

async void async void

异步任务 async task

使用void的内存使用情况要多得多,但操作完成很多更快。我对线程知之甚少,这就是我提出这个问题的原因。有人可以解释为什么会这样吗?

此外,我对何时何时不使用async void进行了一些研究,但我无法找到问题的答案。 (我可能没有很好地搜索过。)

谢谢。

1 个答案:

答案 0 :(得分:6)

当您调用async void方法或在没有等待的情况下调用async Task方法时,您的代码将立即继续,而无需等待方法实际完成。这意味着该方法的多次调用可以并行执行 ,但您不知道它们实际完成的时间,您通常需要知道这些。

您可以利用这样的并行执行,同时还可以通过Task存储在集合中然后使用{{}来等待所有调用完成1}}。

另请注意,如果要并行执行代码,则必须确保执行此代码是安全的。这通常被称为“线程安全”。