在Windows应用商店应用中调用异步任务?

时间:2014-01-20 14:19:06

标签: c#

我有一个工作的“保存阅读器”,可以从winform中删除不需要的数据,然后返回一个称为“项目”的字符串列表。

我的问题是转换它时用于winstore应用程序;我无法调用异步任务,我需要使用一个来访问该文件。

我不是100%肯定如何做到这一点,所以任何帮助表示赞赏;这就是我到目前为止所拥有的。 公共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;
    }
}

}

2 个答案:

答案 0 :(得分:0)

很少需要这样做,但在异步中解决构造函数的典型方法是使用静态方法:

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

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

SaveGame g = await SaveGame.Create();

在您的情况下考虑UI代码和后端代码之间更清晰的分离可能是值得的。如果某些事情看起来很奇怪或很难,那通常是设计缺陷的标志。

此外,一个人不会“调用异步任务”。您调用异步方法并等待任务。

答案 1 :(得分:-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);