2016-12-22 18 views
1

と呼ばれる方法に適用されます、私は次のコードを持っても待っています。は、非同期は

この場合、Class.ClassMethod(text)awaitで呼び出されます。私が理解する限り、メソッドはもはや非同期ではなく、順番に実行されます。これまでのすべての罰金。

しかしawaitは、例えば実施された後のawait機能は、です。ClassMethod関数内で呼び出されたメソッドに適用されますがfollowingClassMethodのコードも適用待っているだろうか、私はまたfollowingClassmethodawaitを追加する必要があります。

followingClassMethodにつきましては、followingClassMethodなどと呼ばれる方法にも適用されます。もしそうなら、どの時点で適用が止まるでしょうか?

適用されない場合は、ClassMethodでは、コンストラクタとメソッドが同時に実行されることを意味しますか?明らかにうまくいきません。この場合、非同期を使用してコンストラクタを呼び出すことができないため、これを解決するにはどうすればよいですか?メソッドでコンストラクタをラップして非同期にするという答えを見たことがありますが、それはちょっとハッキリしているようですね。

答えて

1

私が理解する限り、メソッドはもはや非同期ではなく、順番に実行されることを意味します。

いいえ、それは意味しません。 (var res =など)は続きの一部であり、完了したことを示すメッセージ(Class.ClassMethod(text)の結果)が1回だけ実行されることを意味します。

しかし、我々はまた、followingClassMethodが返すものを知る必要があります。 stringを返すように見えます。この場合、asyncは無関係であり、そのメソッドは常に同期的に実行され、既に完了したタスクを返します。これは、var res =継続でもが直ちに/同期して実行されることを意味します。余談として、おそらくあなたはすでにコンパイラ警告を受ける:

は、この非同期メソッドCS1998警告は、オペレータ「を待つ」と同期的に実行されますが欠如しています。 'await'演算子を使用してノンブロッキングAPI呼び出しを待機するか、 'await Task.Run(...)'を使用してバックグラウンドスレッドでCPUバインド作業を行うことを検討してください。

asyncは何も役立たないと言っています。

は、または私はまたfollowingClassmethodに待つを追加する必要があります。followingClassmethodの結果はawaitable自体でない限り、あなたはそれを行うことはできません

- たとえばTask<string>ため。 ナイーブアプローチその後、書くことがあるでしょう:

public async static Task<string> ClassMethod(string text) 
{ 
    NextClass followingClass = new NextClass(); 
    return await followingClass.followingClassMethod(text); 
} 

しかしこれは、抽象化の不要なレベルを追加し、あなただけでasyncされていない以上、何も獲得していない:

public static Task<string> ClassMethod(string text) 
{ 
    NextClass followingClass = new NextClass(); 
    return followingClass.followingClassMethod(text); 
} 
+0

私が見ることができる上記の場合をClassMethodを非同期にする必要はありません。しかし、これを非同期タスクとして使用する必要がある場合は、ClassMethodで待機するように指定する必要があります。それ以外の場合は非同期です。 – Alex

+1

@Alexは、あなたが「async」として何を意味すると思うかによって異なります。本当にここに真に非同期なものがありますか?非同期のコードを書くことを可能にするためにコンパイラの魔法を誘発するだけの非同期の 'async' /' await'を書いているわけではありません。あなたの最終的な質問は:いいえ、 'ClassMethod'が' async'ではなく、 'followingClassMethod'の待ち合わせ可能な性質を正しく通している例を明示しました(* this *が' async'であると仮定して) –

+1

@MarcGravell : '' async'/'await'は' ClassMethod'コードで役に立つと思います。特に、 'NextClass'コンストラクタが(ボーンヘッドではない)例外をスローした場合。 –