我想将资源中的文件读入流中,我目前将其用作以下内容:
public async void LoadWidthOfUnicodesData()
{
string dataFile = @"Assets\QuranData\Data_Font1.xml";
StorageFolder InstallationFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
StorageFile file = await InstallationFolder.GetFileAsync(dataFile);
Stream readStream = await file.OpenStreamForReadAsync();
DataContractSerializer ser = new DataContractSerializer(typeof(List<UniCodeWidth>));
WidthOfUnicodes = (List<UniCodeWidth>)ser.ReadObject(readStream);
for (int i = 0; i < WidthOfUnicodes.Count; i++)
{
WidthOfUnicodesDict.Add(WidthOfUnicodes[i].UniCode, WidthOfUnicodes[i].Width);
}
}
唯一的问题是,该部分是在我的viewmodel中,并且因为它是一个非阻塞操作,当VM使用View作为其DataContext初始化时,构造函数会执行它应该做的事情来填充视图但是我总是在使用WidthOfUnicodesDict
时遇到异常,因为它尚未填充数据。
我想做的是要么使读取流式传输同步方法(不使用async / await),到目前为止我还不知道如何在Windows应用商店中执行此操作。或以某种方式使VM构造函数等待,直到此操作完成并通知它已完成。
答案 0 :(得分:-1)
您可以在没有async / await语义的情况下获取文件,如下所示:
var file = Package.Current.InstalledLocation.GetFileAsync(Folder)
.GetAwaiter()
.GetResult();
我不知道如何获取流,但您可以使用FileIO
获取IBuffer
或将其作为文字阅读:
string content = FileIO.ReadTextAsync(file).GetAwaiter().GetResult();
IList lines = FileIO.ReadLinesAsync(file).GetAwaiter().GetResult();
IBuffer buffer = FileIO.ReadBufferAsync(file).GetAwaiter().GetResult();
之前我已经这样做了,它不会导致任何死锁。