public Task<Guid> GetMyObjectIdAsync(string objectName)
でより多くの、私はこの方法を使用するだけではなくTask.Run()
で自分自身をそれをラップでいくつかの利点があると期待しています。
特に、I/Oがヒットするとスレッドを解放するか、そうしないとスレッドを解放することができます。今
私は、コードを持っている場合は考慮してください。
_resource = GetResourceForID(GetMyObjectIdAsync(SomeLongRunningWayToGetName()));
(私はこれはタスクで行われている必要があり理由を持っている、と私はTask.Run()
が実際に意味を持たない状況の一種でよ場合私のためにここで
Task task = Task.Run(() => _resource = GetResourceForID(GetMyObjectIdAsync(SomeLongRunningWayToGetName())));
Task.Run()
が悪い考え次のようになります。私は)別のスレッド上に全体をラップするだろうこれを行うための最善の方法を、それをオフロードする理由があります電話番号、またはそれは私が実際に私に与えるものから得ているので、良いかもしれません。
あなたの署名が表示されたら、と考えると、コードでこれを行う最良の方法は、そのメソッドを使用するコードに変換することです。 (async
とawait
を使用してまたは類似の)
Task task = SomeLongRunningWayToGetName()
.ContinueWith(t => GetMyObjectIdAsync(t.Result))
.ContinueWith(t => _resource = GetResourceForIDAsync(t.Result));
。
これはせいぜい、チャンク化があまり良くありません。Task.Run()
です。悪い場合、私はawait
です。実際にはそれが利用可能だったコンテキストでは提供しないより優れた非同期性を得るためにこれを行うだけです。 (これは、私が非同期にしたMVCアクションでこれを使用したのは、余分なオーバーヘッドがより良いスレッドプールの使用で返済されると考えたからです)。
したがって、Task.Run()
が有用な場合がありますが、この場合は常に悪いです。私がクラスの使用にもたらすことができるよりも大きな非同期性を私に与えることができないなら、私があなたのことを信じるように導かないでください。
非同期I/Oを実際に呼び出す場合は、公開XXXAsync()
メソッドのみを提供してください。
には、非同期メソッドをスタブアウトするために、実際にが必要です。これは悪い、あまりにも(呼び出し側がまだちょうど直接GetMyObjectId()
を呼び出すほうだったでしょう)が、少なくともコードawait
sの場合である
public Task<Guid> GetMyObjectIdAsync(string objectName)
{
return Task.FromResult(GetMyObjectId(objectName);
}
:のように良いだろう、共有ベースまたはインタフェースの署名と一致同じスレッド上で動作している間に、別のスレッドを使用してオーバーヘッドが発生しないので、他のスレッドと混ざり合っていると、悪影響が軽減されます。したがって、の場合、はTask
を返す必要がありますが、それを呼び出す方法には何も役立ちません。
本当にが必要な場合は、それを提供する必要はありません。
(プライベートメソッドRun()
を呼び出すすべてのコールサイトのメリットが異なるため、いくつかの場所でRun()
を呼び出すのではなく、便利性を追加するだけですが、十分に文書化する必要があります)。
あなたはその神秘的なSOの投稿をリンクしてみませんか?私は彼らが既にあなたの答えを含んでいるべきである、という意味ですか? – nvoigt
基本的には、「あなたはTask.Run()を使い捨てコメントの一種として使用してはいけません」と言い続けていますが、間違っているかもしれないと心配しています。 –
https://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Async-Library-Methods-Shouldn-t-Lie – SLaks