如何在UWP中使用“ getfileasync”方法读取多个文件

时间:2018-08-30 15:17:23

标签: c# asynchronous file-io uwp

我正在开发UWP应用,我需要读取一些Json fil以便在assests文件夹中使用数据。

然后我创建了此方法,

public async Task<StorageFile> access(string filename)
    {
        var storageFile = await Package.Current.InstalledLocation.GetFileAsync(@"Assets\data\" + filename);
        return storageFile;
    }

public async Task<string> read(StorageFile storagefile)
    {
        string content = await FileIO.ReadTextAsync(storagefile);
        return content;
    }

因此,我在mainpage中使用此方法首先读取文件,

Task<StorageFile> stream1_1 = access("mycourse.json");
Task<string> stream1_2 = read(stream1_1.Result);
string mycourseinfo = stream1_2.Result;

当我尝试在文本块中显示它时,它会成功显示

mytextblock.text = mycourseinfo;

然后我添加了另一个文件来读取第二个文件

Task<StorageFile> stream2_1 = access("class_info.json");
Task<string> stream2_2 = read(stream2_1.Result);
string allclassinfo = stream2_2.Result;

然后问题出炉了,该应用程序也不会编译,也没有显示错误消息,我认为这是一个Dealock .....

我试图单独读取第二个文件,然后再次成功! 那我怎么能解决这个问题呢!我需要读三个文件!

1 个答案:

答案 0 :(得分:1)

您只需要在方法后面添加等待,因为它们正在返回任务。当我在其后添加等待时,它将完成该行的执行,并且仅在完成后将移至下一个代码行,因为您未使用等待,因此正在创建死锁。使用以下代码读取每个文件。

StorageFile stream1_1 = await access("mycourse.json");
string stream1_2 = read(stream1_1);
string mycourseinfo = stream1_2;
  

还请注意,使用await时,返回类型不应为 Task

为了避免使构造函数异步,您必须使用 Loaded 事件。

因此,在页面的构造函数中添加以下已加载的事件,如下所示:

Loaded += async (s, e) =>
{
    //do any awaited stuff here
};