2014-02-06 44 views
0

我想讀的資產中的文件到流,我目前使用它,如下所示:讀入文件到流中的Windows應用商店的應用程序,而無需使用異步/等待

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 store上做到這一點。或者以某種方式使VM構造函數等待,直到此操作完成並通知它已完成。

+0

查看[Stephen Cleary關於'async'和構造函數的文章](http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html)。 – svick

+0

如果正在讀取文件,這是一個阻止操作。 –

回答

-1

您可以獲取無異步文件/等待語義是這樣的:

var file = Package.Current.InstalledLocation.GetFileAsync(Folder) 
       .GetAwaiter() 
       .GetResult(); 

我不知道怎麼去流,但你可以得到一個IBuffer或閱讀文本,使用FileIO

string content = FileIO.ReadTextAsync(file).GetAwaiter().GetResult(); 
IList lines = FileIO.ReadLinesAsync(file).GetAwaiter().GetResult(); 
IBuffer buffer = FileIO.ReadBufferAsync(file).GetAwaiter().GetResult(); 

我這樣做過,它不會造成任何死鎖。

+2

但它會阻止UI線程,這就是爲什麼你永遠不應該這樣做。 – svick

+0

@svick *如果它在UI線程上運行,是的。但是,這不是OP正在尋找什麼?要同步運行它? – dcastro

+2

當一個問題詢問「如何做X?」時,有時候正確的答案是「不要做X,而是做Y,這是怎麼回事。」 – svick

相關問題