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方法时,您的代码将立即继续,而无需等待方法实际完成。 这意味着该方法的多个调用可以并行执行,但您不知道它们实际完成的时间,您通常需要知道。

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

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