我有一个返回DropboxClient
的方法,我需要等待一个方法才能获得创建此AccessToken
所需的DropboxClient
。我遇到问题的代码片段是:
OAuth2Response authUriComplete =
await Dropbox.Api.DropboxOAuth2Helper.ProcessCodeFlowAsync(token,
options.ClientId, options.ClientSecret);
var dbx = new DropboxClient(authUriComplete.AccessToken);
return dbx;
所以我无法弄清楚如何使这个方法正常工作,我需要创建一个方法来返回DropboxClient
,我知道我可以返回任务然后在方法之外等待它但这不是我需要的。
答案 0 :(得分:1)
一旦你开始使用async / await,你就需要关注链。所以你的方法应该看起来像
public async Task<DropboxClient> GetClient()
{
OAuth2Response authUriComplete =
await Dropbox.Api.DropboxOAuth2Helper.ProcessCodeFlowAsync(token, options.ClientId, options.ClientSecret);
return new DropboxClient(authUriComplete.AccessToken);
}
你会称之为:
var dbx = await GetClient();
如果您想要不使用等待,那么您也可以
var dbx = GetClient().Result;
答案 1 :(得分:1)
我需要创建一个返回DropboxClient的方法,我知道我可以返回任务,然后在方法之外等待它,但这不是我需要的。
如果您正在使用异步操作,那么您的使用方法也应该是异步的。这是使用async
/ await
的自然,正确的方法。我称之为"async all the way" in my article on async best practices。
在某些情况下,现有代码使这种做法变得不可行,或者过时的第三方或框架代码使得这种情况变得不可能。在这种情况下,您可以使用one of the hacks described in my article on brownfield async development。
请注意 没有黑客在所有情况下都有效!每次黑客都有某种缺点。在阻塞黑客的情况下,缺点是潜在的死锁。
答案 2 :(得分:0)
await关键字将暂停执行该方法,直到完成为止。因此,在authUriComplete具有其值之后才会执行dbx,一旦它执行,它将返回dropboxclient。
但是,根据代码的其余部分,它可能会在此函数返回之前继续在调用程序中执行。如果这是问题,您需要组织代码,以便在dropboxclient返回后您需要做的任何事情等待这种情况发生。
为什么你认为你不需要等待任务?您可以使用Task<DropboxClient>
而非Task
设置Dropbox客户端。
请参阅Jamiec的详细答案。