我想从调用另一个异步函数的函数返回一个字符串。你能告诉我这是否可行? 这是我的功能
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
}
我只想返回令牌值。但是如果我改变了返回类型。我收到编译错误
“await运算符只能在异步方法中使用”
如果我完全删除等待如下:
public string LoginAsync()
{
var credential = GenerateCredentialAsync();
return credential.Token;
}
尝试取消引用credential.token
时出现此错误“任务&LT; TokenCredential&gt;不包含令牌的定义。
你能帮忙解决这个问题吗?
答案 0 :(得分:0)
听起来你错过了某处的异步声明。
您的上述代码:
Query<Kind> query = new QueryBuilder()
.name(name)
.address(address)
.gender(gender)
.build();
100%正确(假设GenerateCredentialAsync包含属性&#39; Token&#39;返回&#39; TokenCredential&#39;
您可能遇到的问题是,无论调用LoginAsync是什么,都会错过&#39; async&#39;宣言。
你不能等待&#39;除非您使用标记为异步
的方法一般规则是你需要链中的每一种方法。被标记为异步。
答案 1 :(得分:-1)
您应该在Task&lt;&gt;中使用TokenCredential.Token类型作为返回类型。
如果TokenCredential.Token是字符串类型,您应该:
public async Task<string> LoginAsync()
此致
答案 2 :(得分:-1)
如果凭据的Task<TokenCredential>
属性返回Token
,则方法的返回类型实际上应为TokenCredential
。如果Token属性返回string
,则方法的返回类型应为Task<string>
。到目前为止一切都很好。
问题可能在于您如何调用LoginAsync()
方法。由于这是一个异步,你应该等待它:
TokenCredential token = await LoginAsync();
这要求您从标记为async
的方法中调用它。
如果将LoginAsync
方法定义为同步方法,则需要在从LoginAsync()方法返回之前获取GenerateCredentialAsync()
的结果。您可以通过阻止返回的Result
:
Task
属性来执行此操作
public string LoginAsync()
{
var credential = GenerateCredentialAsync().Result;
return credential.Token;
}
请注意,不推荐使用后一种方法。有关不应阻止异步代码的原因的更多信息,请参阅Stephen Cleary的博客文章:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html