0

在我的本地盒子上,以下代码有效:

 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 时可以确定前一行是完整的?

感谢您提供的任何帮助。

4

1 回答 1

0

正如@JB 指出的那样,您需要使用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
    // ...
}
于 2013-04-28T18:33:19.063 回答