返回对象的方法可以等待任务

时间:2016-07-27 09:05:36

标签: c#

我有一个返回DropboxClient的方法,我需要等待一个方法才能获得创建此AccessToken所需的DropboxClient。我遇到问题的代码片段是:

OAuth2Response authUriComplete = 
    await Dropbox.Api.DropboxOAuth2Helper.ProcessCodeFlowAsync(token, 
    options.ClientId, options.ClientSecret);

var dbx = new DropboxClient(authUriComplete.AccessToken);
return dbx;

所以我无法弄清楚如何使这个方法正常工作,我需要创建一个方法来返回DropboxClient,我知道我可以返回任务然后在方法之外等待它但这不是我需要的。

3 个答案:

答案 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的详细答案。