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。此外,不应尝试在同步包装器中包装异步方法。如果不知道自己在做什么,这将不可避免地导致死锁等问题。