コードで申し訳ないんだが、↓みたいな処理の名前ってどうすべき?
内容としては、taskの正常終了時のみ completionFunc をかまして結果を作成、それ以外は taskの状態を引き継いだ新しいTaskを返す

public static Task<TOut> WrapPipeline<TIn, TOut>(this Task<TIn> task, Func<TIn, TOut> completionFunc)
{
 var tcs = new TaskCompletionSource<TOut>();
 switch( task.Status ){
 case TaskStatus.Canceled:
  tcs.TrySetCanceled(); break;
 case TaskStatus.Faulted:
  tcs.TrySetException(task.Exception.InnerExceptions); break;
 case TaskStatus.RanToCompletion:
  TOut result;
  try{
   result = completionFunc(task.Result);
  } catch(Exception ex){
   tcs.TrySetException(ex); break;
  }
  tcs.TrySetResult(result); break;
 }
 return tcs.Task;
}