我有一个绑定在XAML中的属性,该属性应该从文件返回一个图像。该属性调用以下代码:
private async Task<BitmapImage> GetBitmapImageAsync(StorageFile file)
{
Debug.WriteLine("GetBitmapImageAsync for file {0}", file.Path);
BitmapImage bitmap = new BitmapImage();
Debug.WriteLine("... opening the stream");
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
{
Debug.WriteLine("... setting the source");
bitmap.SetSource(stream);
Debug.WriteLine("... and returning");
return bitmap;
}
}
我遇到的问题是代码将输出调试文本“...打开流”然后它似乎挂起。
任何人都可以看到我做错了什么或者我可以尝试解决这个问题吗?
答案 0 :(得分:2)
我遇到了类似的问题:WinRT: Loading static data with GetFileFromApplicationUriAsync()
请看亚历山大的答案。
答案 1 :(得分:0)
物业是否在等待任务?如果是这样,则会出现同步上下文问题。
答案 2 :(得分:0)
为了清楚起见(已经对上面提供的Raubi的回答进行了评论),这里是我重新构建代码的方式,以便在没有在错误的线程上访问UI对象的情况下工作。
调用代码如下所示:
BitmapImage bitmap = new BitmapImage();
IRandomAccessStream stream = GetBitmapStreamAsync(file).Result;
bitmap.SetSource(stream);
return bitmap;
并且GetBitmapStreamAsync的代码是这样的:
private async Task<IRandomAccessStream> GetBitmapStreamAsync(StorageFile file)
{
Debug.WriteLine("GetBitmapStreamAsync for file {0}", file.Path);
IRandomAccessStream stream = await file.OpenReadAsync().AsTask().ConfigureAwait(false);
return stream;
}
几点说明:
我之所以将BitmapImage的创建移动到调用代码,而不是将其保留在原始的GetBitmapImageAsync中,是因为当您使用ConfigureAwait时,代码会在不同的上执行线程然后引发异常。
调用代码为GetBitmapStreamAsync(file)的原因.Result而不是使用await是因为此代码位于Property中,您不能使用async。