从Google获取用户个人资料时,应用停止响应

时间:2018-08-21 07:41:25

标签: c# google-api google-api-dotnet-client

我尝试使用Google .NET API来获取经过验证的用户电子邮件,但应用程序停止在我标记为****的行中进行响应。第一次运行它时,它将打开浏览器并询问我的GMAIL,选择gmail后表示现在可以关闭浏览器窗口,但我的桌面应用程序将停止响应。下次我运行应用程序时,它只会停止响应,除非我从Google.Apis.Auth删除AppData\Roaming文件夹:

        private async Task VerifyEmail()
        {
            UserCredential credential;
            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                new ClientSecrets
                {
                    ClientId = "xxxx.apps.googleusercontent.com",
                    ClientSecret = "xxxx-xxxxx"
                },
                new[] { Google.Apis.Oauth2.v2.Oauth2Service.Scope.UserinfoEmail },
                "user",
                CancellationToken.None,
                new FileDataStore("My.DataStore")
                );

            var initializer =
        new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "My App",
        };
            var oauthSerivce = new Google.Apis.Oauth2.v2.Oauth2Service(initializer);

            // app stops responding here **** :
            var userInfo = await oauthSerivce.Userinfo.Get().ExecuteAsync();
            MessageBox.Show(userInfo.Email);
        }

1 个答案:

答案 0 :(得分:1)

该问题的大部分内容都在注释中,因此我在下面进行了总结:

  

它有.Result,与等待相同。

.Resultawait不同。 await将调用标记为async,并告诉.Net在异步上下文中运行此请求,而不会阻塞。 .Result阻塞线程并尝试获取结果。您应该(主要)永远不要阻塞这样的异步代码,请访问Stephen Cleary的博客Don't Block on Async Code

  

增加了等待(也是上面的问题),仍然僵持。 :|

async代码需要在async上下文中调用。因此,您还必须使所有父方法都异步。 You can use a thread pool thread to get around this。但是最好的解决方案是使所有先前的方法调用async。这确实意味着async倾向于在您的代码库中传播,但这就是野兽的本质。