29

私は非同期メソッドを持っています:

public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, string language, bool throwEx = true)
{
    UserLoginExResult result = await UserService.LoginExAsync(UserGroup, language, TimezoneOffset, GetDeviceInfo(), GetLoginProperties(), exRequest);

    ProcessLoginResult(result, false, throwEx);

    return result;
}

そして過負荷:

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

オーバーロードされたもの(パラメーターが少ないもの)をマークしてasync使用する必要があるかどうかわかりませんawait? すべきではないと思いますが、もしそうしたらどうなるか教えていただけますか? 私はここでかなり迷子になっていて、それが何Taskを待っているのか本当にわかりませんか? 余分なものを作成しますか、Taskそれともawait新しいものを作成しませんTaskか?

4

4 に答える 4

25

いいえ、既存のメソッドをラップおよびアンラップするだけの場合は、非同期メソッドを使用するメリットはほとんどありません。ここに「通常の」メソッドを用意して、「実際の」非同期メソッドに委譲しても問題ありません。

(これらはまったく同じではありません。たとえば、UserService.LoginExAsyncメソッドが失敗したタスクを返すのではなく例外をスローする場合、async/await バージョンは失敗したタスクを返すだけですが、他のバージョンすぐにスローします。)

于 2012-10-26T11:45:33.300 に答える
11

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

詳細については、Stephen Toub の Zen of Async トーク を参照してください。彼はこの状況に直接対処します。

于 2012-10-26T11:51:01.943 に答える
5

オーバーロードで追加の作業を行っている場合にのみ、実際に行う価値があります。

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;
}

しかし、あなたがそうではないので、そうではありません!

于 2012-10-26T11:50:42.100 に答える
2

オーバーロードは、内部的に何も待機しないため、マークする必要はありませasyncん。したがって、コンパイラが書き直すものは何もありません。

于 2012-10-26T11:45:49.407 に答える