[英]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()
的結果。 您可以通過阻止返回的Task
的Result
屬性來執行此操作:
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.