这可能是一个非常愚蠢的问题,但我有以下编码行将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秒。为什么会这样?
使用void
的内存使用情况要多得多,但操作完成很多更快。我对线程知之甚少,这就是我提出这个问题的原因。有人可以解释为什么会这样吗?
此外,我对何时何时不使用async void
进行了一些研究,但我无法找到问题的答案。 (我可能没有很好地搜索过。)
谢谢。
答案 0 :(得分:6)
当您调用async void
方法或在没有等待的情况下调用async Task
方法时,您的代码将立即继续,而无需等待方法实际完成。这意味着该方法的多次调用可以并行执行 ,但您不知道它们实际完成的时间,您通常需要知道这些。
您可以利用这样的并行执行,同时还可以通过将Task
存储在集合中然后使用{{}来等待所有调用完成1}}。
另请注意,如果要并行执行代码,则必须确保执行此代码是安全的。这通常被称为“线程安全”。