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

时间:2017-02-13 15:59:54

标签: c# .net asynchronous async-await

我想从调用另一个异步函数的函数返回一个字符串。你能告诉我这是否可行? 这是我的功能

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;不包含令牌的定义。

你能帮忙解决这个问题吗?

3 个答案:

答案 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