Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ApplicationData.current.LocalFolder.CreateFolderAsync在surface Pro上失败_C#_Windows Store Apps - Fatal编程技术网

C# ApplicationData.current.LocalFolder.CreateFolderAsync在surface Pro上失败

C# ApplicationData.current.LocalFolder.CreateFolderAsync在surface Pro上失败,c#,windows-store-apps,C#,Windows Store Apps,在我的本地设备上,以下代码起作用: public async Task<GameStatistic> LoadReport() { var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(FolderName, CreationCollisionOption.OpenIfExists); var file = await folder.GetFileAs

在我的本地设备上,以下代码起作用:

 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;
    }
公共异步任务加载报告()
{
var folder=wait ApplicationData.Current.LocalFolder.CreateFolderAsync(FolderName,CreationCollisionOption.OpenIfExists);
var file=await folder.GetFileAsync(文件名);
游戏统计返回值;
使用(var inStream=await file.OpenSequentialReadAsync())
{
var serializer=newdatacontractjsonserializer(typeof(GameStatistic));
returnValue=serializer.ReadObject(inStream.AsStreamForRead())作为游戏统计;
}
返回值;
}
调用上述方法的代码:

  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;
    }
公共游戏统计GetReportData() { var repo=new GameRepository(); var gameStatTask=repo.LoadReport();/(等待)任务 gameStatTask.Wait();//这似乎没有什么区别 返回gameStatTask.Result; } 但是,当我将代码移动到Surface Pro并运行应用程序(无调试器)时,
文件夹.GetFileAsync(FileName)
失败,因为获取文件夹的异步调用尚未返回

当我在Surface Pro上调试应用程序时(通过远程机器),慢慢地让调试器通过第一行代码并等待几秒钟,然后再次执行步骤,一切正常

我不喜欢尝试让一根线在任意的时间内睡眠,但我不确定我还能做什么

是否有什么我做错了或我应该做但我根本没有做的事情? 是否有一种常见的做法会真正等到CreateFolderAsync返回,这样当我调用folder.GetFileAsync时,我就可以确保前一行已经完成了


感谢您提供的任何帮助。

正如@J.B所指出的,您需要使用
wait
而不是
wait
。另外,调用
async
方法的任何函数本身都应该是
async
(至少有一个例外)。因此,几乎整个UI调用堆栈都必须更改为异步任务的某种变体…:

async public Task<GameStatistic> GetReportData()
{
    var repo = new GameRepository();
    return await repo.LoadReport(); //(awaitable) Task<GameStatistic>
}

看看这个SO线程(或者更具体地说,它的答案)。我不确定,但我认为您可能需要使用
Wait gameStatTask
而不是
。Wait()
?谢谢您的输入。不幸的是没有变化。问题代码已经有wait关键字,但是下一行即使任务没有完成也会执行。谢谢您的输入。我可能需要再澄清一点。我使用的是MVVM模式,我的ReportViewModel的构造函数正在调用GetReportData(),因此调用链的顶端是一个构造函数。基本上,我希望在显示xaml视图时加载报告。无法在构造函数中执行我想要的操作吗?@LanceWarthen-不幸的是
async
和构造函数不能混合使用。一种方法是使用一个额外的
async
方法进行初始化。我已经尽可能地简化了它。我创建了一个button_click事件,并在按下按钮后加载数据。不是我真正想要的,但这就是生活。。。最好是通过实例化而不是用户交互加载框架。但它是有效的。非常感谢@Chue x
async public Task<MyResultClass> GetReportAndResult()
{
     var gameStat = await GetReportData();
     return ReportDataToMyResult(gameStat);
}
async void GetReportData_ButtonClick(...)
{
    var result = await GetReportAndResult();
    // do something with result
    // ...
}