我尝试使用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);
}
答案 0 :(得分:1)
该问题的大部分内容都在注释中,因此我在下面进行了总结:
它有
.Result
,与等待相同。
.Result
与await
不同。 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
倾向于在您的代码库中传播,但这就是野兽的本质。