提问者:小点点

异步任务vs异步无效


这可能是一个非常愚蠢的问题,但我有以下几行代码将原始图像转换为位图图像:

public async void CreateImageThumbnails(string imagePath, int imgId)
{
    await Task.Run(() => controlCollection.Where(x => x.ImageId == imgId).FirstOrDefault().ImageSource = ThumbnailCreator.CreateThumbnail(imagePath));
}

调用此方法

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;
}

当在我的方法中使用而不是时,我的应用程序处理图像(其中29个)比快大约11秒。为什么会这样?

使用内存占用要多得多,但操作完成得快得多。我对线程的了解很少,这就是我问这个问题的原因。有人能解释一下为什么会出现这种情况吗?

此外,我还对何时和何时不使用进行了一些研究,但我没有找到问题的答案。(我可能只是搜索得不是很好)。

谢谢。


共1个答案

匿名用户

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

您可以利用这样并行执行的优势,同时还可以通过将来等待所有调用完成。

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

相关问题