簡體   English   中英

C#,從調用另一個異步函數的函數返回字符串?

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM