public static Task <TR> SelectMany <TI, TC, TR>(this Task <TI> task, Func <TI, Task <TC> > selector, Func <TI, TC, TR> projector) { var taskSource = new TaskCompletionSource <TR>(); taskSource.SetResultFromTask(task, (ts, taskResult) => ts.SetResultFromTaskSafe(() => selector(taskResult), (ts_, selectorResult) => ts_.SetResultSafe(() => projector(taskResult, selectorResult)))); return(taskSource.Task); }
public static Task <TR> Select <TI, TR>(this Task <TI> task, Func <TI, TR> selector) { var taskSource = new TaskCompletionSource <TR>(); taskSource.SetResultFromTask(task, (ts, taskResult) => ts.SetResultSafe(() => selector(taskResult))); return(taskSource.Task); }
public static void SetResultFromTaskSafe <TI, TR>(this TaskCompletionSource <TR> taskSource, Func <Task <TI> > getTask, Action <TaskCompletionSource <TR>, TI> setResultAction) { Task <TI> task; try { task = getTask(); } catch (Exception e) { taskSource.SetException(e); return; } taskSource.SetResultFromTask(task, setResultAction); }
public static Task <T> Where <T>(this Task <T> task, Func <T, bool> predicate) { var taskSource = new TaskCompletionSource <T>(); taskSource.SetResultFromTask(task, (ts, taskResult) => { ts.SetResultSafe(() => predicate(taskResult), (ts_, predicateResult) => { if (predicateResult) { ts_.SetResult(taskResult); } else { ts_.SetCanceled(); } }); }); return(taskSource.Task); }
public static void SetResultFromTask <T>(this TaskCompletionSource <T> taskSource, Task <T> task) { taskSource.SetResultFromTask(task, (ts, taskResult) => ts.SetResult(taskResult)); }
public static void SetResultFromTask <TI, TR>(this TaskCompletionSource <TR> taskSource, Task <TI> task, Action <TaskCompletionSource <TR>, TI> setResultAction) { taskSource.SetResultFromTask(task, setResultAction, x => x.SetCanceled()); }