方法,该方法返回一个能够等待任务的对象

本文关键字:方法 等待 任务 对象 一个 返回 | 更新日期: 2023-09-27 17:58:43

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

OAuth2Response authUriComplete = 
    await Dropbox.Api.DropboxOAuth2Helper.ProcessCodeFlowAsync(token, 
    options.ClientId, options.ClientSecret);
var dbx = new DropboxClient(authUriComplete.AccessToken);
return dbx;

所以我不知道如何让这个方法工作,我需要创建一个返回DropboxClient的方法,我知道我可以返回任务,然后在方法外等待它,但这不是我需要的。

方法,该方法返回一个能够等待任务的对象

一旦您开始使用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;

我需要创建一个返回DropboxClient的方法,我知道我可以返回任务,然后在方法外等待它,但这不是我需要的。

如果您正在使用异步操作,那么您的使用方法也应该是异步的。这是使用async/await的自然、正确的方式。我在关于异步最佳实践的文章中称之为"异步一路"。

在某些情况下,现有的代码使其不可行,或者过时的第三方或框架代码使其无法实现。在这种情况下,您可以使用我在关于brownfield异步开发的文章中描述的一种技巧。

请注意,没有破解,适用于所有场景

await关键字将暂停方法的执行,直到它完成。因此,在authUriComplete获得其值之前,dbx不会被执行,并且一旦执行,它将返回dropboxclient。

但是,根据代码的其余部分,在该函数返回之前,它可能会在调用方中继续执行。如果这就是问题所在,那么您需要组织您的代码,以便在dropboxclient返回后,无论您需要做什么,都可以等待这种情况的发生。

为什么你认为你不需要等待任务?您可以通过使用Task<DropboxClient>而不仅仅是Task来设置Dropbox客户端。

有关详细信息,请参阅Jamiec的回答。