2017-07-03 212 views
12

这可能是一个非常愚蠢的问题,但我有编码的以下行是转换RAW图像BitmapImages:异步任务VS异步无效

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秒。为什么会这样?

异步无效 async void

异步任务 async task

的内存使用情况是使用void得多,但操作完成更快。我对线程知之甚少,这就是为什么我问这个问题。有人可以解释为什么会发生这种情况吗?

此外,我已经做了一些研究,何时何时不使用async void,但我无法找到我的问题的答案。 (我可能没有很好地搜索)。

谢谢。

+1

也许这将有助于:https://stackoverflow.com/questions/12144077 –

+0

'异步无效'是火和遗忘,所以没有任何人跟踪异步操作(或者甚至确保它完全运行),而'异步任务'实际上保持了一个可以等待的轨道。 – poke

+0

当您使用任务时,您是否在等待任务? – Magnus

回答

6

当您调用async void方法,或者在不等待它的情况下调用async Task方法时,代码将立即继续,而不用等待方法实际完成。这意味着该方法的多次调用可并行执行,但您不知道它们何时实际完成,通常您需要知道。

你可以在这样的并行执行的优势,同时还能够等到所有的调用由集合在存储Task秒,然后用await Task.WhenAll(tasks);完成。

另外请记住,如果你想并行执行代码,你必须确保它是安全的。这通常被称为“线程安全”。