在不使用async / await的情况下将文件读入Windows Store App中的流

时间:2014-02-06 08:41:14

标签: c# mvvm windows-store-apps async-await

我想将资源中的文件读入流中,我目前将其用作以下内容:

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构造函数等待,直到此操作完成并通知它已完成。

1 个答案:

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

之前我已经这样做了,它不会导致任何死锁。