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);
。
另请注意,如果要并行执行代码,则必须确保执行此代码是安全的。 这通常称为“线程安全”。