2014-01-20 80 views
-1

我有一個工作「保存閱讀器」,可以將不需要的數據從winform中刪除,然後返回稱爲「項目」的字符串列表。在Windows Store應用程序中調用異步任務?

我的問題是,當轉換此用於與Winstore應用程序一起使用;我無法調用異步任務,我需要使用一個來訪問該文件。

我不是100%確定如何做到這一點,所以任何幫助表示讚賞;這是迄今爲止我所擁有的。 public SaveGame(StorageFile文件) File = promptUser(); }

拋出一個錯誤,我試圖做的構造異步,但拋出更多的錯誤

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using Windows.Storage; 
using Windows.Storage.Pickers; 

namespace save_game_reader 
{ 
class SaveGame 
{ 
    private StorageFile File { get; set; } 


    public SaveGame(StorageFile file) 
    { 
     File = promptUser(); 
     Task<StorageFile> returnedTaskTResult = promptUser(); 
     StorageFile intResult = await promptUser(); 
    } 

    public async Task<List<string>> GetAllItems() 
    { 
     string WholeSaveString = await Windows.Storage.FileIO.ReadTextAsync(File); 
     List<string> ToReturn = new List<string>(); 

     List<string> SplitList = WholeSaveString.Split(new string[] { "data" }, StringSplitOptions.None).ToList(); 
     foreach (string line in SplitList) 
     { 
      var start = line.IndexOf("value") + 6; 
      var end = line.IndexOf("type", start); 
      if (end != -1) 
      { 
       string substring = line.Substring(start, (end - start) - 8); 
       if (substring.Length >= 4) 
       { 
        ToReturn.Add(substring); 
       } 
      } 
     } 
     return ToReturn; 
    } 
    private async Task<StorageFile> promptUser() 
    { 
     var picker = new FileOpenPicker(); 
     picker.ViewMode = PickerViewMode.Thumbnail; 
     picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; 

     StorageFile sf = await picker.PickSingleFileAsync(); 

     return sf; 
    } 
} 

}

+1

你是什麼意思的「我不能稱之爲異步任務」? Windows Store應用程序開發肯定支持'async' ... –

+0

抱歉,生病澄清。 我寫了我的異步任務,但我不知道如何給他們打電話。 so publicGame(StorageFile file) File = promptUser(); }拋出一個錯誤 –

+0

嗯,是的,你需要'等待'任務'得到'StorageFile' ...但這只是正常的異步/等待,並且與它是一個Windows應用商店應用無關。而你將無法在構造函數中做到這一點...... –

回答

-1

構造函數不能是異步,改變你的代碼如下:

public SaveGame() 
{} 

public async Task Init(Storage file) 
{ 
    File = promptUser(); 
    Task<StorageFile> returnedTaskTResult = promptUser(); 
    StorageFile intResult = await promptUser(); 
} 

你可以這樣稱呼它的異步方法的其他地方:

var save = new SaveGame(); 
await save.Init(file); 
+2

從長遠來看,靜態工廠方法和私有構造函數可能會更容易被發現,並且它可以是'async'。忘記調用通用的'Init'方法總是令需要使用代碼的可憐靈魂感到沮喪:D – Gusdor

+0

我認爲這讓我走上正軌。但要調用await save.Init(file);我不需要讓這個類異步嗎?等等等等? –

+0

@LiamHaymanTansley是的,一般來說,在使用它時,你需要「一路向上」。 – Servy

0

這是非常罕見的需要這樣做,但典型的方法來解決構造函數在異步是隻使用一個靜態方法:

class SaveGame 
{ 
    SaveGame(StorageFile file) 
    { 
     File = file; 
    } 

    public async Task<SaveGame> Create() 
    { 
     return new SaveGame(await promptUser()); 
    } 
} 

SaveGame g = await SaveGame.Create(); 

這可能是值得的,你的情況考慮UI代碼和後端代碼之間更清晰的分離。如果某件事看起來很奇怪或難以實現,那往往是設計缺陷的一個標誌。

此外,一個不會「調用異步任務」。您調用異步方法並等待任務。

相關問題