这可能是一个非常愚蠢的问题,但是我有以下几行代码将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
进行了一些研究,但找不到我的问题的答案。 (我可能搜索的不是很好)。谢谢。
最佳答案
当您调用async void
方法或不等待而调用async Task
方法时(如果被调用的方法包含await
,因此它不会阻塞),您的代码将立即继续,而无需等待该方法实际完成。这意味着该方法的多个调用可以并行执行,但是您通常不知道它们何时真正完成。
您可以利用像这样并行执行的优势,同时还可以通过将Task
存储在集合中,然后使用await Task.WhenAll(tasks);
来等待所有调用完成。
还请记住,如果要并行执行代码,则必须确保这样做是安全的。这通常称为“线程安全”。
关于c# - 异步任务与异步无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44883765/