我正在开发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 .....
我试图单独读取第二个文件,然后再次成功! 那我怎么能解决这个问题呢!我需要读三个文件!
答案 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
};