Пример #1
0
        public async Task Test_AsyncTransform()
        {
            // async transform start concurrent tasks for all source items

            const int N            = 100;
            const int MAX_CAPACITY = 5;

            // since this can lock up, we need a global timeout !
            using (var go = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
            {
                var token = go.Token;

                var rnd1 = new Random(1234);

                var queue = AsyncHelpers.CreateOrderPreservingAsyncBuffer <double>(MAX_CAPACITY);

                var transform = new AsyncTransform <int, double>(
                    async(x, _) =>
                {
                    // each element takes a random time to compute
                    await Task.Delay(5 + rnd1.Next(25), this.Cancellation);
                    return(Math.Sqrt(x));
                },
                    queue,
                    TaskScheduler.Default
                    );

                var pumpTask = queue.PumpToListAsync(token);

                for (int i = 0; i < N; i++)
                {
                    // emulate a batched source
                    if (i % 10 == 0)
                    {
                        await Task.Delay(100, this.Cancellation);
                    }

                    await transform.OnNextAsync(i, token);
                }
                transform.OnCompleted();


                await Task.WhenAny(pumpTask, Task.Delay(10 * 1000, go.Token));

                if (!pumpTask.IsCompleted)
                {
                    Log("FAILED: HARD TIMEOUT! PumpTask did not complete in time :(");
                    Assert.Fail("The PumpTask did not complete in time");
                }

                var list = await pumpTask;

                Log($"results: {String.Join(", ", list)}");
                Assert.That(list, Is.EqualTo(Enumerable.Range(0, N).Select(x => Math.Sqrt(x)).ToArray()));
            }
        }
Пример #2
0
        public async Task Test_FdbAsyncTransform()
        {
            // async transform start concurrent tasks for all source items

            const int N            = 100;
            const int MAX_CAPACITY = 5;

            // since this can lock up, we need a global timeout !
            using (var go = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
            {
                var token = go.Token;

                var rnd1 = new Random(1234);

                var queue = AsyncHelpers.CreateOrderPreservingAsyncBuffer <double>(MAX_CAPACITY);

                var transform = new AsyncTransform <int, double>(
                    async(x, _) =>
                {
                    // each element takes a random time to compute
                    await Task.Delay(5 + rnd1.Next(25));
                    return(Math.Sqrt(x));
                },
                    queue,
                    TaskScheduler.Default
                    );

                var pumpTask = AsyncHelpers.PumpToListAsync(queue, token);

                var rnd2 = new Random(5678);

                for (int i = 0; i < N; i++)
                {
                    // emulate a batched source
                    if (i % 10 == 0)
                    {
                        await Task.Delay(100);
                    }

                    await transform.OnNextAsync(i, token);
                }
                transform.OnCompleted();

                var list = await pumpTask;

                Console.WriteLine("results: " + String.Join(", ", list));
                Assert.That(list, Is.EqualTo(Enumerable.Range(0, N).Select(x => Math.Sqrt(x)).ToArray()));
            }
        }
		public async Task Test_FdbAsyncTransform()
		{
			// async transform start concurrent tasks for all source items

			const int N = 100;
			const int MAX_CAPACITY = 5;

			// since this can lock up, we need a global timeout !
			using (var go = new CancellationTokenSource(TimeSpan.FromSeconds(10)))
			{
				var token = go.Token;

				var rnd1 = new Random(1234);

				var queue = AsyncHelpers.CreateOrderPreservingAsyncBuffer<double>(MAX_CAPACITY);

				var transform = new AsyncTransform<int, double>(
					async (x, _) =>
					{
						// each element takes a random time to compute
						await Task.Delay(5 + rnd1.Next(25));
						return Math.Sqrt(x);
					},
					queue,
					TaskScheduler.Default
				);

				var pumpTask = AsyncHelpers.PumpToListAsync(queue, token);

				var rnd2 = new Random(5678);

				for (int i = 0; i < N; i++)
				{
					// emulate a batched source
					if (i % 10 == 0) await Task.Delay(100);

					await transform.OnNextAsync(i, token);
				}
				transform.OnCompleted();

				var list = await pumpTask;

				Console.WriteLine("results: " + String.Join(", ", list));
				Assert.That(list, Is.EqualTo(Enumerable.Range(0, N).Select(x => Math.Sqrt(x)).ToArray()));
			}
		}