メソッド名の接尾辞に「非同期」の規則はありますか?
「Async」サフィックスは、修飾子を使用して宣言されたメソッドにのみ追加する必要がありasync
ますか?
public async Task<bool> ConnectAsync()
それとも、この方法だけで返すことは十分ですTask<T>
かTask
?
public Task<bool> ConnectAsync()
メソッド名の接尾辞に「非同期」の規則はありますか?
「Async」サフィックスは、修飾子を使用して宣言されたメソッドにのみ追加する必要がありasync
ますか?
public async Task<bool> ConnectAsync()
それとも、この方法だけで返すことは十分ですTask<T>
かTask
?
public Task<bool> ConnectAsync()
回答:
マイクロソフトのドキュメントからも、真実は曖昧だと思います。
Visual Studio 2012および.NET Framework 4.5では、
async
キーワード(Async
Visual Basicの場合)に起因するメソッドは非同期メソッドと見なされ、C#およびVisual Basicコンパイラーは必要な変換を実行して、TAPを使用してメソッドを非同期に実装します。非同期メソッドはTask
またはTask<TResult>
オブジェクトを返す必要があります。
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
それはまだ正しくありません。を含むメソッドasync
はすべて非同期であり、その場合、「Task
または」のいずれかを返す必要があると言っています。Task<T>
これは、コールスタックの最上位にあるメソッド、たとえばButton_Clickなどでは正しくありませんasync void
。
もちろん、大会のポイントは何ですか?
あなたは、と言うことができAsync
接尾辞規則は方法がawaitableあるAPIの利用者に伝えることです。メソッドが待機可能であるためには、それはTask
voidまたはTask<T>
値を返すメソッドのために返す必要があります。つまり、メソッドにのみ接尾辞を付けることができますAsync
。
またはあなたはそれを言うかもしれません Async
サフィックスの規約は、メソッドがすぐに戻り、現在のスレッドを放棄して他の作業を実行し、競合を引き起こす可能性があることを通知することです。
このマイクロソフトのドキュメントの引用は言う:
慣例として、Asyncまたはasync修飾子を持つメソッドの名前に「Async」を追加します。
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
それはあなたが返す独自の非同期メソッドTask
がAsync
サフィックスを必要とすることさえ言及していません。
したがって、この質問に対する答えは次のようになります。どちらの場合も、キーワードを使用Async
してメソッドに追加する必要があり、それによってor async
が返されます。Task
Task<T>
状況を明らかにするようにスティーブン・トウブに依頼します。
更新
だから私はしました。そして、ここに私たちの善人が書いたものがあります:
パブリックメソッドがTask-returningであり、本質的に非同期である場合(常に完了まで同期的に実行されることがわかっていても、何らかの理由でTaskを返すメソッドとは対照的)、「Async」というサフィックスが必要です。それがガイドラインです。ここでの命名の主な目的は、呼び出されているメソッドがすべての作業を同期的に完了しない可能性があることを機能の利用者に非常に明白にすることです。もちろん、機能が同期メソッドと非同期メソッドの両方で公開されているため、それらを区別するために名前の違いが必要な場合にも役立ちます。メソッドがその非同期実装をどのように実現するかは、命名には重要ではありません。async/ awaitを使用してコンパイラーのヘルプを取得するか、System.Threading.Tasksの型とメソッドを直接使用するか(e。g。TaskCompletionSource)は、メソッドのコンシューマに関する限り、メソッドのシグネチャに影響を与えないため、実際には問題になりません。
もちろん、ガイドラインには常に例外があります。名前付けの場合の最も注目すべきものは、型全体の存在理由が非同期に焦点を合わせた機能を提供することである場合です。この場合、すべてのメソッドに非同期を設定することは過剰です。たとえば、他のタスクを生成するタスク自体のメソッド。
voidを返す非同期メソッドについては、呼び出し側が非同期処理がいつ完了したかを知るための適切な方法がないため、それらをパブリックサーフェス領域に置くことは望ましくありません。ただし、voidを返す非同期メソッドをパブリックに公開する必要がある場合は、非同期作業が開始されていることを伝える名前を付けた方がよいでしょう。意味がある場合は、ここで「非同期」サフィックスを使用できます。このケースがどれほどまれであるかを考えると、それは実際にはケースバイケースの決定であると私は主張します。
それが役に立てば幸い
スティーブンの冒頭の文章からの簡潔なガイダンスは十分に明確です。async void
非同期voidを実装する正しい方法はプレーンなTask
インスタンスを返してコンパイラーを魔法にかけることなので、そのような設計でパブリックAPIを作成することは珍しいため、これは除外されます。ただし、が必要な場合はpublic async void
、追加することAsync
をお勧めします。async void
イベントハンドラーなど、その他のスタックの最上位メソッドは、通常はパブリックではなく、重要ではありません。
私にとって、の接尾辞について疑問に思っている場合Async
はasync void
、おそらくそれをに変えてasync Task
、発信者がそれを待つことができるようにしてから、を追加する必要があることを教えてくれますAsync
。
PersonString
かPriceDecimal
、なぜ使用GetAsync
-要求は、常にすべてのタスクを完全とにかく後に返すよう非同期APIの必要性はない。この心配のAPIの消費者。そのばかげて本当に私を悩ませます。しかし、それがなぜそこにあるのか誰も本当に知らない、それは単なる別の慣習です。
ほとんどのコードが非同期で実行されている他のシステムを呼び出す多くのAPIサービスやその他のアプリケーションを構築しています。
私が従う私自身の経験則は:
同じものを返す非非同期メソッドと非同期メソッドの両方がある場合は、非同期メソッドにAsyncのサフィックスを付けます。そうでない場合。
例:
1つの方法のみ:
public async Task<User> GetUser() { [...] }
2つの署名を持つ同じメソッド:
public User GetUser() { [...] }
public async Task<User> GetUserAsync() { [...] }
返されるのは同じデータなので、これは理にかなっていますが、異なるのは、データ自体ではなく、データを返す方法だけです。
また、この命名規則は、非同期メソッドを導入し、下位互換性を維持する必要があるために存在すると思います。
新しいコードではAsyncサフィックスを使用しないでください。このスレッドで前述したように、StringまたはIntの戻り型と同じくらい明白です。
メソッド名に「非同期」の接尾辞を付けるための規則は何ですか。
タスクベースの非同期パターン(TAP)メソッドは、常に返すことを命ずるTask<T>
(またはTask
)で命名され非同期サフィックス。これはの使用とは別ですasync
。Task<bool> Connect()
とはどちらも正常にコンパイルおよび実行されますが、TAPの命名規則に従っていません。async
Task<bool> Connect()
メソッドに
async
修飾子を含める必要がありますか、それともタスクを返すだけで十分ですか?
メソッドの本体(戻り値の型または名前に関係なく)にが含まれているawait
場合は、を使用する必要がありますasync
。コンパイラーは、「 'await'演算子は非同期メソッド内でのみ使用できます。...」と通知します。返却Task<T>
またはTask
使用を避けるために「十分」ではありませんasync
。詳細については、async(C#リファレンス)を参照してください。
つまり、これらの署名のどれが正しいですか。
両方と適切TAPの規則に従ってください。キーワードはいつでも使用できますが、本文でを使用しないと、「この非同期メソッドには「待機」演算子がなく、同期して実行されます...」というコンパイラ警告が表示されます。async
Task<bool> ConnectAsync()
Task<bool> ConnectAsync()
async
await
async
キーワードを使用するかどうかではなく、メソッド名に「非同期」を追加するかどうかについて言及しています。
async
は、質問の2番目の部分です。
async
修飾子を使用するかどうかです。OPの例public async Task<bool> ConnectAsync()
(async
修飾子あり)とpublic Task<bool> ConnectAsync()
(async
修飾子なし)も参照してください。メソッド名自体には、どちらの場合でも「Async」というサフィックスが付いています。
Task
またはを持つメソッドの名前に追加する必要があることasync Task
です。
以来Task
とTask<T>
両方awaitableタイプがあり、それらを表現するいくつかの非同期操作を。または、少なくともそれらを表す必要があります。
Async
メソッドにサフィックスを追加する必要があります。メソッドは、場合によっては(必ずしもすべてではない)値を返さず、進行中の操作のラッパーを返します。そのラッパーは通常a Task
ですが、Windows RTでは可能ですIAsyncInfo
。コードのユーザーがAsync
関数を見ると、直感に倣って、そのメソッドの呼び出しがそのメソッドの結果から切り離され、それに応じて動作する必要があることがわかります。
Task.Delay
and などのメソッドがありTask.WhenAll
、戻り値Task
があり、Async
サフィックスがないことに注意してください。
また、起動して非同期メソッドを忘れるasync void
メソッドがあることにも注意してください。メソッドはそのように構築されていることに注意してください。
メソッドがasync
修飾子で宣言されているかどうかに関係なく、タスクが返される場合は、Async-suffixを使用する必要があると私は主張します。
その背後にある理由は、名前がインターフェースで宣言されていることです。インターフェイスは、戻り値の型を宣言しますTask
。次に、そのインターフェースの2つの実装があり、1つの実装はasync
修飾子を使用してそれを実装し、もう1つの実装はそうではありません。
public interface IFoo
{
Task FooAsync();
}
public class FooA : IFoo
{
public Task FooAsync() { /* ... */ }
}
public class FooB : IFoo
{
public async Task FooAsync() { /* ... */ }
}
では非同期とのawaitと非同期プログラミング(C#) 、マイクロソフトは、以下のガイダンスを提供しています:
命名規則
慣例により、非同期修飾子を持つメソッドの名前に「非同期」を追加します 。
イベント、基本クラス、またはインターフェイスコントラクトが別の名前を提案している規則は無視できます。たとえば、などの一般的なイベントハンドラの名前は変更しないでください
Button1_Click
。
このガイダンスは不完全であり、満足のいくものではありません。これは、async
修飾子がない場合、このメソッドのConnect
代わりに名前を付ける必要があることを意味しConnectAsync
ますか?
public Task<bool> ConnectAsync()
{
return ConnectAsyncInternal();
}
私はそうは思いません。@Servyによる簡潔な回答と@Luke Puplettによる詳細な回答に示されているように、このメソッドに名前を付けることが適切であり、実際に予期されています(待機可能なメソッドが返されるため)。これをさらにサポートでは、@ジョンスキートで、この答え別の質問には、追加かかわらずの存在のメソッド名に修正。ConnectAsync
Async
async
最後に、別の質問で、@ Damien_The_Unbelieverによるこのコメントを検討してください。
async/await
ある実装あなたの方法の詳細が表示されます。呼び出し元に関する限り、メソッドが宣言されているかどうかasync Task Method()
だけTask Method()
で問題はありません。(実際、これらの2つの間で、重大な変更と見なされることなく、後から自由に変更できます。)
それから、メソッドの命名方法を決定するのはメソッドの非同期の性質であると推測します。メソッドのユーザーは、async
修飾子がその実装で使用されているかどうかさえ知りません(C#ソースコードまたはCILなし)。