Windows通用10异步冻结程序

时间:2015-12-18 18:44:41

标签: c# async-await win-universal-app

我希望使用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
});

提前感谢。

2 个答案:

答案 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");