Esempio n. 1
0
        static async Task Main(string[] args)
        {
#if !DEBUG
            //await new AllocationCheck().ViaUniTaskVoid();
            //Console.ReadLine();
            BenchmarkDotNet.Running.BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);

            //await new ComparisonBenchmarks().ViaUniTaskT();
            return;
#endif

            var e = UniTaskAsyncEnumerable.Create <int>(async(writer, token) =>
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine($"Start {i}");
                    await writer.YieldAsync(i);
                    Console.WriteLine($"End {i}");
                }
            });

            var ee = e.GetAsyncEnumerator();
            while (await ee.MoveNextAsync())
            {
                Console.WriteLine("ForEach " + ee.Current);
            }
        }
Esempio n. 2
0
 /// <summary>
 /// 在C#7.0中创建自己的UniTaskAsyncEnumerable,
 /// C#8.0有更加简洁的语法支持,但在使用Unity2020之前不考虑它。
 ///
 /// 除非真的很通用,你可能没有必要实现自己的UniTaskAsyncEnumerable
 /// 通常特殊条件才yield产出的Enumerable都可以通过现有的AsyncEnumerable过滤来获得。
 /// </summary>
 /// <returns></returns>
 public IUniTaskAsyncEnumerable <int> MyEveryUpdate()
 {
     return(UniTaskAsyncEnumerable.Create <int>(async(writer, token) => {
         var frameCount = 0;
         await UniTask.Yield();
         while (!token.IsCancellationRequested)
         {
             await writer.YieldAsync(frameCount++);
             await UniTask.Yield();
         }
     }));
 }
Esempio n. 3
0
 // 指定の整数がゼロになるまで一定間隔でカウントダウンする
 private IUniTaskAsyncEnumerable <int> CountDownAsync(int startCount, TimeSpan timeSpan)
 {
     return(UniTaskAsyncEnumerable.Create <int>(async(writer, token) =>
     {
         var currentCount = startCount;
         while (currentCount >= 0)
         {
             // writer.YieldAsync を使うと UniTaskAsyncEnumerable に値が書き込まれる
             await writer.YieldAsync(currentCount--);
             await UniTask.Delay(timeSpan, cancellationToken: token);
         }
     }));
 }
Esempio n. 4
0
        public async Task ASyncManually()
        {
            var list = new List <int>();
            var xs   = UniTaskAsyncEnumerable.Create <int>(async(writer, token) =>
            {
                await UniTask.Yield();

                list.Add(100);
                await writer.YieldAsync(10);

                await UniTask.Yield();

                list.Add(200);
                await writer.YieldAsync(20);

                await UniTask.Yield();
                list.Add(300);
                await UniTask.Yield();
                await writer.YieldAsync(30);

                await UniTask.Yield();

                list.Add(400);
            });

            list.Should().BeEmpty();
            var e = xs.GetAsyncEnumerator();

            list.Should().BeEmpty();

            await e.MoveNextAsync();

            list.Should().BeEquivalentTo(100);
            e.Current.Should().Be(10);

            await e.MoveNextAsync();

            list.Should().BeEquivalentTo(100, 200);
            e.Current.Should().Be(20);

            await e.MoveNextAsync();

            list.Should().BeEquivalentTo(100, 200, 300);
            e.Current.Should().Be(30);

            (await e.MoveNextAsync()).Should().BeFalse();
            list.Should().BeEquivalentTo(100, 200, 300, 400);
        }
Esempio n. 5
0
        public async Task SyncExceptionFirst()
        {
            var from  = 10;
            var count = 100;

            var xs = UniTaskAsyncEnumerable.Create <int>(async(writer, token) =>
            {
                for (int i = 0; i < count; i++)
                {
                    throw new UniTaskTestException();
                    await writer.YieldAsync(from + i);
                }
            });

            await Assert.ThrowsAsync <UniTaskTestException>(async() => await xs.ToArrayAsync());
        }
Esempio n. 6
0
        public async Task SyncCreation()
        {
            var from  = 10;
            var count = 100;

            var xs = await UniTaskAsyncEnumerable.Create <int>(async (writer, token) =>
            {
                for (int i = 0; i < count; i++)
                {
                    await writer.YieldAsync(from + i);
                }
            }).ToArrayAsync();

            var ys = await Range(from, count).AsUniTaskAsyncEnumerable().ToArrayAsync();

            xs.Should().BeEquivalentTo(ys);
        }