Создайте BitmapFrame асинхронно в асинхронном методе

Кто-нибудь знает, как создать BitmapFrame асинхронно в WPF?

Я хочу, чтобы пакетная печать 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 блок?

1 ответ

Решение

Вы должны асинхронно загрузить веб-изображение и создать 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);
        }
    });
}
Другие вопросы по тегам