2017-02-13 5 views
1

別の非同期関数を呼び出す関数から文字列を返したいとします。これが可能かどうか教えていただけますか? これは私が唯一のトークン値を返すようにしたい私の機能C#、別の非同期関数を呼び出す関数から文字列を返しますか?

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にタスク< TokenCredential>トークンの定義が含まれていませんが

をしようとしたとき、私はこのエラーを取得します。

助けてもらえますか?

+2

コードで匿名のクラスは見つかりません。とにかく、なぜあなたがそれらを望むのかは明らかではありません。いずれにしても、匿名クラスを扱うための「通常のトリック」はジェネリックです。 –

+1

どのようなタイプの 'トークン'ですか? 'Task の代わりに'非同期タスク 'を返すと、最初のバージョンが動作します。 –

+1

あなたのメソッドは 'async'とマークされていますが、' await'を使うことでエラーが発生すると言っていますが、上記の匿名クラスやコードもありません。 – ColinM

答えて

-1

資格情報のTokenプロパティがTokenCredentialを返す場合、メソッドの戻り値の型は実際にはTask<TokenCredential>である必要があります。 Tokenプロパティがstringを返す場合、メソッドの戻り値の型はTask<string>である必要があります。ここまでは順調ですね。

おそらくLoginAsync()メソッドを呼び出す方法の問題です。これは非同期あるので、あなたはそれを待つ必要があります。これはasyncとしてマークされている方法からそれを呼び出すためにあなたを必要とし

TokenCredential token = await LoginAsync(); 

LoginAsyncメソッドを同期メソッドとして定義する場合は、GenerateCredentialAsync()の結果を取得してからLoginAsync()メソッドから返す必要があります。あなたは返さ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

-1

タスク<>の戻り値の型としてTokenCredential.Tokenの型を使用する必要があります。

TokenCredential.Tokenが文字列型である場合、あなたが持っている必要があります。

public async Task<string> LoginAsync() 

よろしく

+0

こんにちは@Krzysztof私はこれを試しましたが、上記の資格情報を逆参照するとエラーが発生します。タスクにはトークンの定義が含まれていません – sachin

0

どこか非同期宣言が欠けているように聞こえます。

あなたの上記のコード:

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を返すプロパティ「トークン」が含まれていることを仮定して(100%正しいですが「TokenCredential」

あなたはおそらく持っている問題何がLoginAsyncを呼び出すことです「非同期」宣言が欠落している。

を使用すると、非同期としてマークされた方法でない限りあなたが何かを「待つ」ことができません

「チェーン」内のすべてのメソッドを非同期としてマークする必要があります。

関連する問題