2015-12-02 51 views
1

我正在使用Newtonsoft.Json來讀取json文件。我正在嘗試對json文件進行aysnc調用以讀取其數據,但不幸的是它沒有返回任何內容。我想沒有異步和它完美的作品,下面是我的代碼:異步反序列化調用不在C中工作#

public static async Task<T> LoadAsync<T>(string filePath) 
{ 
     // filePath: any json file present locally on the disk 
     string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\", ""); 
     string fullPath = Path.Combine(basePath, filePath); 
     using (var stream = File.OpenRead(fullPath)) 
     { 
      var reader = new StreamReader(stream, Encoding.GetEncoding("iso-8859-1")); 
      var task = Task.Factory.StartNew(() => JsonConvert.DeserializeObject<T>(reader.ReadToEnd())); 
      var value = await task; 
      return value; 
     } 
} 

我試圖調試,但調試器在上述方法的「返回值」不來了,我用下面的函數調用上述方法:

private void GetDataFromJson() 
{ 
     var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE); 
} 

可能是什麼問題?文件存在於我的電腦本地。

+5

如果你的'LoadAsync'方法是'async',那麼你應該等待它。 (這又意味着'GetDataFromJson'應該是'async Task'而不是'void'。) – David

回答

2

我試圖讓aysnc調用JSON文件中讀取其數據

你真的想使代碼異步? JsonUtilities課程是否提供LoadAsync()方法的同步版本?

你的方法是同步的:

private void GetDataFromJson() 
{ 
     var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE); 
} 

這不正是一件事情:它調用LoadAsync()。它確實將該方法的返回值存儲在value中,但您從不使用value。所以它被忽略了。 LoadAsync()的返回值不是TaxOffice對象。這是Task,代表着LoadAsync()正在做的工作。在完成任務之前,沒有辦法獲得價值。但是GetDataFromJson()不會等待任務完成。因此,如果調用者希望在方法返回的時候完成,它將非常失望。

如何最好地修復您的代碼尚不清楚,因爲您沒有提供a good, minimal, complete code example顯示您需要幫助。但是,有兩個明顯的策略,你可以遵循:

製作方法異步:

private async Task GetDataFromJson() 
{ 
     var value = await JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE); 

     // presumably you do something with "value" here? 
} 

這是最好的辦法。但是它要求調用者能夠正確處理異步調用。它可能也需要變成async方法。它的來電者。等等,直到你到達你的調用堆棧的頂部(例如事件處理程序方法)。

在整個調用堆棧中切換到async是件痛苦的事情,但是如果你這樣做的話代碼會更好。你的線程(可能是一個UI線程)不會卡在等待操作,你也將被設置爲正確處理其他異步操作。

忽略LoadAsync()方法的異步特性:

private void GetDataFromJson() 
{ 
     var value = JsonUtilities.LoadAsync<TaxOffice>(Constant.TAXJSONINPUTFILE).Result; 

     // presumably you do something with "value" here? 
} 

這是不太好™方法。有用。但是它會阻止當前的線程,直到異步操作完成,否則首先會失去進行異步操作的全部好處。