async Task vs async void

Car*_*r22 15 c# task void async-await

这可能是一个非常愚蠢的问题,但我有以下编码行将RAW图像转换为BitmapImages:

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

它调用这种方法 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;
}
Run Code Online (Sandbox Code Playgroud)

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

异步无效 异步无效

异步任务 异步任务

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

我还做了一些关于什么时候和什么时候不使用的研究async void,但我找不到我的问题的答案.(我可能没有很好地搜索过).

谢谢.

svi*_*ick 6

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

您可以像这样并行执行,同时还可以通过Tasks 存储在集合中然后使用来等待所有调用完成await Task.WhenAll(tasks);.

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