在我的本地方框中,以下代码有效:
public async Task<GameStatistic> LoadReport()
{
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(FolderName, CreationCollisionOption.OpenIfExists);
var file = await folder.GetFileAsync(FileName);
GameStatistic returnValue;
using (var inStream = await file.OpenSequentialReadAsync())
{
var serializer = new DataContractJsonSerializer(typeof (GameStatistic));
returnValue = serializer.ReadObject(inStream.AsStreamForRead()) as GameStatistic;
}
return returnValue;
}
调用上述方法的代码:
public GameStatistic GetReportData()
{
var repo = new GameRepository();
var gameStatTask = repo.LoadReport(); //(awaitable) Task<GameStatistic>
gameStatTask.Wait(); //this seems to make no difference
return gameStatTask.Result;
}
但是当我转移到Surface Pro的代码并运行应用程序(没有调试器)时,folder.GetFileAsync(FileName)
失败了,因为用于获取文件夹的异步调用还没有返回。
当我在Surface Pro上调试应用程序(通过远程计算机)并慢慢地将调试器移过第一行代码并等待几秒钟,然后再次执行时,一切正常。
我不想尝试让线程在任意长度的时间内睡觉,但我不确定我还能在这里做些什么。
我做错了什么或者我应该做的事情,我根本不做什么? 是否有一种常见的做法,它会等到CreateFolderAsync返回,这样当我调用folder.GetFileAsync时,我可以确定上一行已完成?
感谢您提供的任何帮助。
答案 0 :(得分:0)
正如@ J.B指出,您需要使用await
代替wait
。此外,调用async
方法的任何函数本身都应为async
(至少有一个例外)。因此,几乎整个UI的调用堆栈必须更改为async Task<...>...
的一些变体:
async public Task<GameStatistic> GetReportData()
{
var repo = new GameRepository();
return await repo.LoadReport(); //(awaitable) Task<GameStatistic>
}
上面的来电者(只是一种随意的方法):
async public Task<MyResultClass> GetReportAndResult()
{
var gameStat = await GetReportData();
return ReportDataToMyResult(gameStat);
}
调用链顶端(事件处理程序)必须是async void
:
async void GetReportData_ButtonClick(...)
{
var result = await GetReportAndResult();
// do something with result
// ...
}