Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C、 从调用另一个异步函数的函数返回字符串?_C#_.net_Asynchronous_Async Await - Fatal编程技术网

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

C# C、 从调用另一个异步函数的函数返回字符串?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我想从调用另一个异步函数的函数返回一个字符串。你能告诉我这是否可行吗? 这是我的职责 public async Task<TokenCredential> LoginAsync() { var credential = await GenerateCredentialAsync(); // This is a library function //that returns

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

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
}
尝试取消引用credential.token时出现此错误

'Task不包含令牌的定义


您能帮个忙吗?

您应该使用TokenCredential.Token的类型作为任务中的返回类型

如果TokenCredential.Token为字符串类型,则应具有:

public async Task<string> LoginAsync()

关于

您应该使用TokenCredential.Token的类型作为任务中的返回类型

如果TokenCredential.Token为字符串类型,则应具有:

public async Task<string> LoginAsync()

关于

听起来好像您在某处缺少异步声明

您的上述代码:

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
}
假设GenerateCredentialAsync包含返回“TokenCredential”的属性“Token”,则100%正确

您可能遇到的问题是,调用LoginAsync的任何东西都缺少“异步”声明

除非在标记为async的方法中,否则不能“等待”某些内容


一般规则是,您需要将“链”中的每个方法都标记为异步。

听起来您好像在某处缺少异步声明

您的上述代码:

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
}
假设GenerateCredentialAsync包含返回“TokenCredential”的属性“Token”,则100%正确

您可能遇到的问题是,调用LoginAsync的任何东西都缺少“异步”声明

除非在标记为async的方法中,否则不能“等待”某些内容


一般规则是,您需要将“链”中的每个方法都标记为异步。

方法的返回类型实际上应该是Task,前提是凭证的Token属性返回TokenCredential。如果Token属性返回字符串,则方法的返回类型应为Task。到目前为止还不错

问题可能在于如何调用LoginAsync方法。由于这是一个异步进程,您应该等待它:

TokenCredential token = await LoginAsync();
这要求您从标记为async的方法调用它

如果将LoginAsync方法定义为同步方法,则需要在从LoginAsync方法返回之前获得GenerateCredentialAsync的结果。您可以通过阻塞返回任务的Result属性来执行此操作:


但请注意,不建议采用后一种方法。请参阅Stephen Cleary的博客文章,了解有关为什么不应阻止异步代码的更多信息:

如果凭据的Token属性返回TokenCredential,则方法的返回类型实际上应该是Task。如果Token属性返回字符串,则方法的返回类型应为Task。到目前为止还不错

问题可能在于如何调用LoginAsync方法。由于这是一个异步进程,您应该等待它:

TokenCredential token = await LoginAsync();
这要求您从标记为async的方法调用它

如果将LoginAsync方法定义为同步方法,则需要在从LoginAsync方法返回之前获得GenerateCredentialAsync的结果。您可以通过阻塞返回任务的Result属性来执行此操作:


但请注意,不建议采用后一种方法。请参阅Stephen Cleary的博客文章,了解有关为什么不应该阻止异步代码的更多信息:

令牌是什么类型的?如果您返回的是异步任务而不是任务,那么您的第一个版本将正常工作。上述内容没有多大意义,您的方法标记为async,但您说使用Wait时出错,上面也没有匿名类或代码。这里的实际问题是,您不能仅从异步方法返回令牌值,您必须返回最终将包含令牌的任务,从而返回任务的类型。使用async时必须使用此返回类型或void。此外,您不应该尝试在同步包装器中包装异步方法。如果您不知道自己在做什么,这将不可避免地导致死锁等问题。令牌是什么类型?如果您返回的是异步任务而不是任务,那么您的第一个版本将正常工作。上述内容没有多大意义,您的方法标记为async,但您说使用Wait时出错,上面也没有匿名类或代码。这里的实际问题是,您不能仅从异步方法返回令牌值,您必须返回最终将包含令牌的任务,从而返回任务的类型。使用async时必须使用此返回类型或void。此外,不应尝试在同步包装器中包装异步方法。如果不知道自己在做什么,这将不可避免地导致死锁等问题。