Car*_*r22 15 c# task void async-await
这可能是一个非常愚蠢的问题,但我有以下编码行将RAW图像转换为BitmapImages:
public async void CreateImageThumbnails(string imagePath, int imgId)
{
await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath));
}
Run Code Online (Sandbox Code Playgroud)
它调用这种方法 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;
}
Run Code Online (Sandbox Code Playgroud)
当使用async Void而不是async Task在我的CreateImageThumbnails方法中时,我的应用程序处理图像(其中29个)比快11秒async Task.为什么会这样?
内存使用更加使用void,但操作完成多快.我对线程知之甚少,这就是我提出这个问题的原因.有人可以解释为什么会这样吗?
我还做了一些关于什么时候和什么时候不使用的研究async void,但我找不到我的问题的答案.(我可能没有很好地搜索过).
谢谢.
当您调用async void方法或在async Task不等待方法的情况下调用方法时,您的代码将立即继续,而无需等待方法实际完成.这意味着该方法的多个调用可以并行执行,但您不知道它们实际完成的时间,您通常需要知道.
您可以像这样并行执行,同时还可以通过将Tasks 存储在集合中然后使用来等待所有调用完成await Task.WhenAll(tasks);.
另请注意,如果要并行执行代码,则必须确保执行此代码是安全的.这通常称为"线程安全".