我希望使用FileIO的ReadBufferAsync方法获取BitmapImage。我想调用的方法是等待另一种异步方法的异步方法。
public class A
{
public static async Task<StorageFile> getFile(string fileName)
{
StorageFolder myfolder = ApplicationData.Current.LocalFolder;
return await myfolder.GetFileAsync(fileName);
}
public static async Task<BitmapImage> getImage(string fileName)
{
StorageFile file = getFile(fileName).Result;
var image = await FileIO.ReadBufferAsync(file);
return new BitmapImage(new Uri(file.Path));
}
}
在另一个班级我打电话给 BitmapImage f = A.getImage(&#34; 123.png&#34;)。结果;
然而,我的程序在等待myfolder.GetFileAsync(fileName)时冻结; 我认为这是因为它没有回到GUI线程。如果是这样的话,如何轻松转到GUI线程又回到这个方法?
有没有一种简单的方法可以解决这个问题?
我尝试使用Task.Run和Factory
Task.Factory.StartNew(() =>
{
//code
});
提前感谢。
答案 0 :(得分:2)
在另一个课程中,我致电
BitmapImage f = A.getImage("123.png").Result;
这可能会冻结用户界面。
询问任务结果等待任务完成。你等待的时候什么也没发生;这包括更新UI。如果那不是你想要的,不要问结果; await
结果:BitmapImage f = await A.getImage("123.png");
。这意味着“在图像可用时此时恢复;在我们等待时继续处理UI更新。”
答案 1 :(得分:0)
这是因为您使用Result
属性获取每项任务的结果。根据{{3}}:
访问属性的get访问器会阻塞调用线程,直到异步操作完成;它相当于调用Wait方法。
要修复此问题(或以异步方式获取结果),您应该await
结果:
public static async Task<BitmapImage> getImage(string fileName)
{
StorageFile file = await getFile(fileName);
var image = await FileIO.ReadBufferAsync(file);
return new BitmapImage(new Uri(file.Path));
}
在你告诉我们的其他课程中,你应该:
BitmapImage f = await A.getImage("123.png");