2012-10-26 28 views
20

より少ないパラメータで)とawaitを使用しますか?私はすべきではないと思いますが、もし私がそれをするなら、何が起こるか教えていただけますか?私はここでかなり失われていて、実際に何が待っていたのでしょうかTaskTaskまたはawaitを追加しても新しいTaskは作成されませんか?.NET 4.5非同期は、私は非同期メソッドを持って待っていますし、オーバーロードされたメソッド

答えて

20

は、既存のものをラップアンドラップしようとしているときに、非同期メソッドを使用することにはほとんどメリットがありません。実際の非同期メソッドに委譲するだけで、ここでは「通常の」メソッドを持つことができます。

(彼らはないよかなり同じ - UserService.LoginExAsyncメソッドが失敗したタスクを返すのではなく、例外をスローした場合、たとえば、非同期/のawaitバージョンはちょうど他のバージョンのに対し、失敗したタスクを返しますをうそれは内部的に何を待っていないとしても、すぐに投げる。)

+0

しかし、追加に何か問題はありますか?オーバーヘッドのコストはいくらですか?または、コンパイラはそれを最適化しますか? –

+0

@Matt:基本的に、簡単なステートマシンを設定するコストです。また、タスクの作成時にスローされる例外がどのように伝達されるかを変更するため、100%の同等のものではありません。しかし、コンパイラは間違いなく一方を他方に最適化しません。 –

+0

ありがとうございます。あなたは私がそれを持っていなくても、議論を解決するのを手伝ってくれました。 :) –

1

過負荷がasyncとしてマークする必要はありませんので、したがって、書き換えコンパイラは何もありません。

3

あなたの過負荷で追加作業を行っていた場合は、実際にはやるしかありません。

public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true) 
{ 
    Task<UserLoginExResult> result = await LoginExAsync(exRequest, Language.ID, throwEx); 

    //Do some work here that depends on the result from the task completeion 

    return result; 
} 

しかし、あなたはそうではありません。

7

asyncキーワードは、awaitキーワードのみ有効にします。あなたの場合、Taskを直接返すことができるので、asyncキーワードは必要ありません。 asyncは、値を追加せずにオーバーヘッドを追加するだけです。

詳細については、Stephen Toub's Zen of Async talkを参照してください。彼はこの状況に直接言及します。

関連する問題