当没有互联网连接时,GetAsync(Live SDK)使其调用方法退出

时间:2015-03-22 17:27:58

标签: c# visual-studio-2013 windows-runtime windows-phone-8.1 live-sdk

我遇到了Live SDK中的一些API问题(我使用的是5.6版本)。

这是一个说明我问题的例子:

private async Task MainMethod()
{
    bool result = await UploadStuffOnOneDrive();
    //Do stuff depending on the result...
}

private static async Task<bool> UploadStuffOnOneDrive()
{
    //Get the OneDrive client...
    String folderID = await GetFolderID(client, "TestFolder", "me/skydrive");
    //Do stuff inside the retrieved folder...
}

private static async Task<String> GetFolderID(LiveConnectClient client, String folderName, String directory)
{
    LiveOperationResult opResult;
    opResult = await client.GetAsync(directory + "/files?filter=folders,albums");
    //Return something from opResult...
}

现在,如果我有可用的网络连接,一切运行正常:UploadStuff方法从GetFolderID获取文件夹ID,然后在该目录中上传文件并返回。

当我没有网络连接时,问题就出现了:我尝试将手机置于空中模式并调用MainMethod。 当GetFolderID被调用时,我认为如果没有可用的连接,或者它只是返回null,我会抛出异常。

相反,我的所有方法只是从我的StackTrace中消失:退出了GetFolderID,其他所有方法也是如此。 我错过了什么吗?

如果方法使其调用方法退出,没有Exception或类似的东西,怎么可能? 如何检查我对GetAsync的调用是否成功?

感谢您的帮助!

塞尔吉奥

1 个答案:

答案 0 :(得分:0)

好的,所以我认为它看起来似乎await调用永远不会返回,所以GetAsync方法不会抛出异常,而是将调用进程置于TaskScheduler的保持状态,这就是&#39; s为什么调试器在空闲状态下返回,我看到StackTrace变为空。

我通过将CancellationTokenSource传递给方法并等待它来解决问题:

LiveOperationResult opResult;
try
{
    var awaitableTask = client.GetAsync(directory + "/files?filter=folders,albums");
    var watchedTask = awaitableTask.ContinueWith(task => task.GetAwaiter().GetResult(), cts.Token);
    opResult = await watchedTask;
catch
{
     throw new OperationCanceledException("Operation canceled by the user");
}