我有一个工作的“保存阅读器”,可以从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;
}
}
}
答案 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);