[英]C#, return a string from a function that calls another async function?
我想从调用另一个异步函数的函数返回一个字符串。 你能告诉我这是否可行吗? 这是我的职责
public async Task<TokenCredential> LoginAsync()
{
var credential = await GenerateCredentialAsync(); // This is a library function
//that returns a 'Task<TokenCredential>'
return credential.Token; // I want to return this value which is a string
}
我只想返回令牌值。 但是,如果我更改返回类型。 我收到编译器错误
“等待操作符只能在异步方法中使用”
。
如果我完全删除等待,如下所示:
public string LoginAsync()
{
var credential = GenerateCredentialAsync();
return credential.Token;
}
尝试取消引用credential.token时出现此错误
'Task <TokenCredential>不包含Token的定义。
你能帮忙吗?
听起来您在某处缺少异步声明。
您上面的代码:
public async Task<TokenCredential> LoginAsync()
{
var credential = await GenerateCredentialAsync(); // This is a library function that returns a 'Task<TokenCredential>'
return credential.Token; // I want to return this value which is a string
}
是100%正确(假设GenerateCredentialAsync包含返回“ TokenCredential”的属性“ Token”
您可能遇到的问题是,无论什么调用LoginAsync都缺少“异步”声明。
除非您处于标记为异步的方法中,否则您无法“等待”某物
一般规则是,您需要将“链”中的每个方法都标记为异步。
您应该使用TokenCredential.Token的类型作为Task <>中的返回类型。
如果TokenCredential.Token为字符串类型,则应具有:
public async Task<string> LoginAsync()
问候
如果凭据的Token
属性返回TokenCredential
,则方法的返回类型实际上应为Task<TokenCredential>
。 如果Token属性返回一个string
,则该方法的返回类型应为Task<string>
。 到现在为止还挺好。
问题可能是您如何调用LoginAsync()
方法。 由于这是异步的,因此您应该等待它:
TokenCredential token = await LoginAsync();
这要求您从标记为async
的方法中调用它。
如果将LoginAsync
方法定义为同步方法,则需要从LoginAsync()方法返回之前获取GenerateCredentialAsync()
的结果。 您可以通过阻止返回的Task
的Result
属性来执行此操作:
public string LoginAsync()
{
var credential = GenerateCredentialAsync().Result;
return credential.Token;
}
请注意,尽管不建议使用后一种方法。 有关为什么不应该阻止异步代码的更多信息,请参阅Stephen Cleary的博客文章: http : //blog.stephencleary.com/2012/07/dont-block-on-async-code.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.