代码之家  ›  专栏  ›  技术社区  ›  AVEbrahimi

应用程序在从Google获取用户配置文件时停止响应

  •  0
  • AVEbrahimi  · 技术社区  · 6 年前

    我尝试使用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 回复  |  直到 6 年前
        1
  •  1
  •   Liam Joshua    6 年前

    这个问题的大部分内容都在评论中,所以我总结如下:

    它有 .Result 和等待一样。

    结果 不是和 await . 等待 将呼叫标记为 async 并告诉.NET在异步上下文中运行它,而不阻塞。 结果 阻止线程并尝试获取结果。你应该(主要)永远不要阻止这样的异步代码,看看斯蒂芬·克利里的博客。 Don't Block on Async Code .

    增加了等待(上面也有问题),仍然死锁。:

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