方法,该方法返回一个能够等待任务的对象
本文关键字:方法 等待 任务 对象 一个 返回 | 更新日期: 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的回答。