Google云端硬盘OAuth连接问题

时间:2014-04-10 17:41:02

标签: c# visual-studio-2010 asynchronous google-drive-api

在我的程序中,我使用以下行启动浏览器窗口以使用户登录并授权权限:

        try
        {
            using (var stream = GenerateClientSecretsStream(this._client_id, this._client_secret))
            {

                GoogleWebAuthorizationBroker.Folder = "Tasks.Auth.Store";
                StoredCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                new[] { DriveService.Scope.Drive,
            DriveService.Scope.DriveFile },
                "user",
                CancellationToken.None,
                new SavedDataStore()).Result;
            }
        }
        catch (AggregateException ae)
        {
            MessageBox.Show("Error when connecting to Google Drive");
            return;
        }

如果您保持在浏览器中并按照预期的顺序执行此操作,则此工作正常,但在测试后如果关闭该窗口并返回到程序,它将被冻结,等待从浏览器返回。我尝试了查看async / await的东西,但是我正在使用VS 2010,所以看起来我无法使用这些选项。

我已经为VS 2010查找了异步CTP,但不建议明确发布版本。我该怎么做才能阻止我的程序在这种情况下锁定?

1 个答案:

答案 0 :(得分:0)

当您访问异步方法的Result属性时,您基本上是同步执行它,因为它实际上与使用Wait();

相同

你应该做的是等待你的方法,它会将控制权交还给调用者,直到方法完成执行:

修改

忘记提及,如果您的方法同步运行或返回void,它应该更改为以下签名:

异步任务MyFooMethod

    try
    {
        using (var stream = GenerateClientSecretsStream(this._client_id, this._client_secret))
        {

            GoogleWebAuthorizationBroker.Folder = "Tasks.Auth.Store";
            await StoredCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            new[] { DriveService.Scope.Drive,
        DriveService.Scope.DriveFile },
            "user",
            CancellationToken.None,
            new SavedDataStore());
        }
    }
    catch (AggregateException ae)
    {
        MessageBox.Show("Error when connecting to Google Drive");
        return;
    }