private void InterceptTaskWithResult <TResult>(IInvocation invocation) { var ctx = new ProfilingContext(); var invocationClone = invocation.Clone(); invocation.ReturnValue = Task.Run(() => BeforeInvoke(ctx, invocation)) .ContinueWith(t => { if (t.Exception != null) { throw t.Exception; } invocationClone.Proceed(); return(invocationClone.ReturnValue as Task <TResult>); }) .Unwrap() .ContinueWith(t => { if (t.Exception != null) { throw t.Exception; } invocationClone.ReturnValue = t.Result; AfterInvoke(ctx, invocationClone); return((TResult)invocationClone.ReturnValue); }); }
private void InterceptTask(IInvocation invocation) { var invocationClone = invocation.Clone(); invocation.ReturnValue = Task.Factory .StartNew(() => this.BeforeInvoke(invocation)) .ContinueWith(t => { invocationClone.Proceed(); return(invocationClone.ReturnValue as Task); }).Unwrap() .ContinueWith(t => { this.AfterInvoke(invocation); this.AfterInvoke(invocation, t); }); }
private void InterceptTaskWithResult <TResult>(IInvocation invocation) { IInvocation invocationClone = invocation.Clone(); invocation.ReturnValue = (object)Task.Factory.StartNew((Action)(() => this.BeforeInvoke(invocation))).ContinueWith <Task <TResult> >((Func <Task, Task <TResult> >)(t => { var tcs = new TaskCompletionSource <TResult>(); if (t.IsFaulted) { tcs.TrySetException(t.Exception); return(tcs.Task); } else if (t.IsCanceled) { tcs.TrySetCanceled(); return(tcs.Task); } invocationClone.Proceed(); return(invocationClone.ReturnValue as Task <TResult>); })).Unwrap <TResult>(); }