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); } }
/// <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(); } })); }
// 指定の整数がゼロになるまで一定間隔でカウントダウンする 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); } })); }
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); }
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()); }
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); }