我遇到了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的调用是否成功?
感谢您的帮助!
塞尔吉奥
答案 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");
}