这可能是一个非常愚蠢的问题,但是我有以下几行代码将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秒。为什么会这样呢?

异​​步无效
c# - 异步任务与异步无效-LMLPHP

异​​步任务
c# - 异步任务与异步无效-LMLPHP

使用void可以大大提高内存使用率,但是操作可以更快地完成。我对线程几乎一无所知,这就是为什么我要问这个问题。有人可以解释为什么会这样吗?

我也对何时和何时不使用async void进行了一些研究,但找不到我的问题的答案。 (我可能搜索的不是很好)。

谢谢。

最佳答案

当您调用async void方法或不等待而调用async Task方法时(如果被调用的方法包含await,因此它不会阻塞),您的代码将立即继续,而无需等待该方法实际完成。这意味着该方法的多个调用可以并行执行,但是您通常不知道它们何时真正完成。

您可以利用像这样并行执行的优势,同时还可以通过将Task存储在集合中,然后使用await Task.WhenAll(tasks);来等待所有调用完成。

还请记住,如果要并行执行代码,则必须确保这样做是安全的。这通常称为“线程安全”。

关于c# - 异步任务与异步无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44883765/

10-12 14:34
查看更多