public async Task TestPipeWriteFirst()
        {
            var q            = new OConcurrentQueue <int>((string mess) => { Console.WriteLine("!:" + mess); });
            var cTokenSource = new CancellationTokenSource();

            var workTask1 = Task.Run(async() =>
            {
                for (var i = 0; i < 10; i++, i++)
                {
                    Console.WriteLine("put in pipe: " + i);
                    q.Enqueue(i);
                    Console.WriteLine(".");
                    await Task.Delay(0);
                }
            });

            await Task.Delay(10);

            var readTask = runReadTask(q, cTokenSource);

            var killTask = runKillTask(50, cTokenSource);

            //Task.WaitAll(readTask);
            await Task.WhenAll(readTask);
        }
        // сколько интов мы прочитаем из очереди за 1 милисекунду (20 чтений за 10 милисекунд с выводом на консоль! без консоли астрономические цифры 19472, 17474 за 1 мс!)
        // 1 ms (после цикла 509918, 388412)
        // без консоли за 10 мс 21395, 17157, 23808, 24696 (после цикла 440525, 1009119, 965629)
        // 100 мс 58818, 242128, 243178
        // результаты довольно странные видимо силно зависит от прогретости проца и видимо очередь успевает расти быстрее чем с нее считывают
        // в общем за 1 мс может пройти дофига и слип даже на 1 мс делать нельзя
        public async Task TestPipeReadSpeed()
        {
            var q            = new OConcurrentQueue <int>();
            var cTokenSource = new CancellationTokenSource();

            var readTask = runReadTask(q, cTokenSource);

            // время на запуск первой задачи (она медленная)
            //await Task.Delay(50);
            for (var i = 0; i < 1000000; i++)
            {
                var j = i * 2;
            }

            var workTask1 = Task.Run(async() =>
            {
                for (var i = 0; i < 300000000; i++)
                {
                    //Console.WriteLine("put in pipe: " + i);
                    q.Enqueue(i);
                    //Console.WriteLine(".");
                    await Task.Delay(0);
                }
            });

            var killTask = runKillTask(10, cTokenSource);

            //Task.WaitAll(readTask);
            await readTask;
        }
        private Task runReadTask(OConcurrentQueue <int> q, CancellationTokenSource cTokenSource)
        {
            return(Task.Run(async() =>
            {
                Console.WriteLine("read task run");

                // хз но иногда WaitAsync вылетает по исключению (ловил вылет на отмене)
                try
                {
                    while (await q.WaitAsync(cTokenSource.Token))
                    {
                        //Console.WriteLine("queue not empty");
                        int n;
                        while (q.TryDequeue(out n))
                        {
                            Console.WriteLine("readed from pipe: " + n);
                            nn = n; // иммитация нагрузки
                        }
                    }
                    Console.WriteLine("false? last:" + nn);
                }
                catch
                {
                    Console.WriteLine("posible cancel?");
                }
            }));
        }
        async public void TestPipeReadFirst()
        {
            var q            = new OConcurrentQueue <int>();
            var cTokenSource = new CancellationTokenSource();

            var readTask = Task.Run(async() =>
            {
                try
                {
                    while (await q.WaitAsync(cTokenSource.Token))
                    {
                        int n;
                        while (q.TryDequeue(out n))
                        {
                            Console.WriteLine("readed from pipe: " + n);
                        }
                    }
                }
                catch { }
            });

            var workTask1 = Task.Run(async() =>
            {
                for (var i = 0; i < 10; i++, i++)
                {
                    Console.WriteLine("put in pipe: " + i);
                    await Task.Delay(10);
                }
            });

            var killTask = runKillTask(1000, cTokenSource);

            //Task.WaitAll(readTask);
            await Task.WhenAll(readTask);

            //Assert.True(res == 30);
        }