Создайте 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);
}
});
}