Beispiel #1
0
        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);
            });
        }
Beispiel #3
0
        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>();
        }