2017-12-11 18 views
0

内でTask.Resultを呼び出す結果を待つためにContinueWith()を使用する次のコードが出てきました。待っているタスクでContinueWith()を使用して、

public async Task<User> GetUser() 
{ 
    return await _serviceRepo.GetUserAsync() 
     .ContinueWith(task => 
     { 
      return task.Result; 
     }); 
} 

ContinueWith()GetUserAsync()コールからタスクが戻るまで、呼び出し元のスレッドをブロックしていますか?

task.Resultは予定されているContinueWith()内にあるため、前件を待っている間何かがブロックされていますかtask

私はこのタイプのコードをいくつかの場所で見ましたが、これは非同期/待機パターンのベストプラクティスと考えられますか? GetUserAsync()コールでは、ContinueWith()を使用するよりも結果を返すことが期待されます。

+2

待機中の「タスク」には「ContinueWith」は使用されていません。 'ContinueWith'によって作成された続行' Task'を待っています。ところで、なぜ公共のタスクを使用しないでください。 GetUser()=> _serviceRepo.GetUserAsync(); ' – PetSerAl

+0

このような理由はありません。 async、await、およびContinueWithを完全に削除することができます。 – Evk

答えて

1

ContinueWith()は、タスクがGetUserAsync()コールから返されるまで呼び出しスレッドをブロックしますか?

いいえ、このスレッドはブロックされません。これはasync操作です。与えられたコードがタスクを待つのではなく、継続がデバッグ中に誤解を招く可能性があることに注意してください。

task.Resultが予定されているContinueWith()内部にあるので、先行タスクを待っている間にブロックされて何ですか?

いいえ、タスクはすでに終了しており、現在のスレッドはブロックされません。ただし、タスクが失敗した場合に例外が発生します。

これはasyn/awaitパターンのベストプラクティスと考えられますか?

いいえ、このコードは、フォームに書き換えることができます。

public async Task<User> GetUser() 
{ 
    return await _serviceRepo.GetUserAsync(); 
} 

ただし、継続中のいくつかのロジックがある場合は、次のように:

public async Task<User> GetUser() 
{ 
    return await _serviceRepo.GetUserAsync() 
     .ContinueWith(task => 
     { 
      // do something with the result, for example, log the success 

      return task.Result; 
     }); 

は、あなたがこれを行うことができます:

public async Task<User> GetUser() 
{ 
    var user = await _serviceRepo.GetUserAsync(); 

    // do something with the result, for example, log the success 

    return user; 
} 
+0

downvoteの理由はありますか? – VMAtm

関連する問題