在异步方法中异步创建 BitmapFrame

Create BitmapFrame asynchronously in an async method

有人知道如何在 WPF 中异步创建 BitmapFrame 吗?

我想批量打印 XAML Image 元素,其中 Source 属性 设置了代码。这里LogoImageUrl是我要异步加载的网页图片URL。

LogoImage.Source = BitmapFrame.Create(new Uri(LogoImageUrl));

我可以创建这样的 async 方法吗:

public async Task<BitmapFrame> GetBitmapFrame(Uri uri)
{
    await ... // What to be awaited?

    return BitmapFrame.Create(uri);
}

...所以我可以在 try 块中使用该方法,然后在 finally 块中打印它?

您应该异步下载网络图像并从下载的缓冲区创建一个 BitmapFrame:

public async Task<BitmapFrame> GetBitmapFrame(Uri uri)
{
    var httpClient = new System.Net.Http.HttpClient();
    var buffer = await httpClient.GetByteArrayAsync(uri);

    using (var stream = new MemoryStream(buffer))
    {
        return BitmapFrame.Create(
            stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}

由于在上面的例子中BitmapFrame.Create调用了一个冻结的BitmapFrame return,你也可以异步创建BitmapFrame(虽然我怀疑这是必要的)。

public async Task<BitmapFrame> GetBitmapFrame(Uri uri)
{
    var httpClient = new System.Net.Http.HttpClient();
    var buffer = await httpClient.GetByteArrayAsync(uri);

    return await Task.Run(() =>
    {
        using (var stream = new MemoryStream(buffer))
        {
            return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        }
    });
}