Example #1
0
        static IAsyncEnumerator <T> Create <T>(Func <CancellationToken, TaskCompletionSource <bool>, Task <bool> > moveNext, Func <T> current, Action dispose)
        {
            var self = default(IAsyncEnumerator <T>);

            self = new AnonymousAsyncEnumerator <T>(
                ct =>
            {
                var tcs = new TaskCompletionSource <bool>();

                var stop = new Action(() =>
                {
                    self.Dispose();
                    tcs.TrySetCanceled();
                });

                var ctr = ct.Register(stop);

                var res = moveNext(ct, tcs).Finally(ctr.Dispose);
                return(res);
            },
                current,
                dispose
                );
            return(self);
        }
Example #2
0
        private static IAsyncEnumerator <T> CreateEnumerator <T>(Func <CancellationToken, TaskCompletionSource <bool>, Task <bool> > moveNext, Func <T> current, Action dispose)
        {
            var self = default(IAsyncEnumerator <T>);

            self = new AnonymousAsyncEnumerator <T>(
                async ct =>
            {
                var tcs = new TaskCompletionSource <bool>();

                var stop = new Action(
                    () =>
                {
                    self.Dispose();
                    tcs.TrySetCanceled();
                });

                using (ct.Register(stop))
                {
                    return(await moveNext(ct, tcs)
                           .ConfigureAwait(false));
                }
            },
                current,
                dispose
                );
            return(self);
        }