在我的程序中,我使用以下行启动浏览器窗口以使用户登录并授权权限:
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,但不建议明确发布版本。我该怎么做才能阻止我的程序在这种情况下锁定?
答案 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;
}