繁体   English   中英

C#,从调用另一个异步函数的函数返回字符串?

[英]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()的结果。 您可以通过阻止返回的TaskResult属性来执行此操作:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM