【发布时间】:2017-12-06 14:46:49
【问题描述】:
这可能是一个非常愚蠢的问题,但我有以下代码行可以将 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 进行了一些研究,但我找不到我的问题的答案。 (我可能只是没有很好地搜索)。
谢谢。
【问题讨论】:
-
也许这会有所帮助:stackoverflow.com/questions/12144077
-
async void是一劳永逸,所以没有任何东西跟踪异步操作(甚至确保它完全运行),而async Task实际上保留了一个可以等待的跟踪。跨度> -
@Magnus 是的,当我使用
Task呼叫CreateImageThumbnails时,我在等待。 -
如果不等待,就和使用void一样。
-
与问题无关,但请记住,如果在
controlCollection中找不到匹配项,FirstOrDefault()可能会抛出NullReferenceException。如果你确定它不会发生,你仍然可以简化它调用controlCollection.First(x => x.ImageId == imgId).ImageSource = ...
标签: c# async-await task void