表面Pro上的ApplicationData.current.LocalFolder.CreateFolderAsync失败

时间:2013-04-28 16:49:54

标签: c# windows-store-apps

在我的本地方框中,以下代码有效:

 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时,我可以确定上一行已完成?

感谢您提供的任何帮助。

1 个答案:

答案 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
    // ...
}