在异步方法中异步创建BitmapFrame

时间:2017-02-21 08:18:45

标签: c# wpf asynchronous bitmapframe

任何人都知道如何在WPF中异步创建BitmapFrame

我想批量打印其Image属性设置为代码的XAML Source元素。这里LogoImageUrl是我想要异步加载的Web图像的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块中打印它?

1 个答案:

答案 0 :(得分:1)

您应该异步下载Web图像并从下载的缓冲区创建一个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,您也可以异步创建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);
        }
    });
}