在异步方法中异步创建 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);
}
});
}
有人知道如何在 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);
}
});
}