static void Main(string[] args)
        {
            PackagePSP pack = new PackagePSP(new PackagePSPStructure(StartBit.ZERO, 32, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12));
            Random     r    = new Random();

            bool ret = false;

            using (FileStream fs = File.OpenWrite("test3.bvr"))
            {
                uint time = 0;
                for (int i = 0; i < 10000; i++)
                {
                    time++;
                    pack.Item[0].Value = time / 1000;
                    pack.Item[1].Value = time % 1000;

                    //pack.Item[2].Value = (uint)i;

                    if (i > 100)
                    {
                        if (i % 100 == 0)
                        {
                            ret = !ret;
                        }
                        if (ret)
                        {
                            pack.Item[2].Value = 100;
                        }
                        else
                        {
                            pack.Item[2].Value = 3000;
                        }
                    }
                    else
                    {
                        pack.Item[2].Value = (uint)i;
                    }

                    //for (int k = 0; k < 1; k++)
                    //{
                    //    pack.Item[k + 2].Value = (uint)r.Next(4095);
                    //    if (k>4)
                    //    {
                    //        pack.Item[k + 2].Value = (uint)(100 * k);
                    //    }
                    //}

                    var p = PSP.Encode(pack);

                    fs.Write(p, 0, p.Length);
                }
            }
            Console.WriteLine("OK");
            Console.ReadKey();
        }
        private async Task <MPoints> BlockDecreaseAsync(int position, int blockSize)
        {
            return(await Task.Run(() =>
            {
                using (FileStream fs = File.OpenRead(fileName))
                {
                    //StreamDecoding sd = new StreamDecoding(fs);

                    MPoints mPointsOut = new MPoints(2);
                    MPoints mPointsBlock;

                    //Создание блока из потока
                    //mPointsBlock = sd.DecodingBlock(blockSize, position);
                    //StreamControl sc = new StreamControl();
                    //sc.SeleсtStream(fs);
                    //var s = sc.ReadStream(blockSize, position);
                    PackagePSP package = new PackagePSP(new PackagePSPStructure(StartBit.ZERO, 32, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12));

                    List <MPoint> mPoints = new List <MPoint>();
                    while (true)
                    {
                        // if (PSP.Decode(s, ref package) == true) break;
                        MPoint mPoint = new MPoint();
                        DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                        dateTime = dateTime.AddSeconds(package.Item[0].Value);
                        dateTime = dateTime.AddMilliseconds(package.Item[1].Value);
                        mPoint.X = dateTime;
                        for (int i = 0; i < mPoint.Y.Length; i++)
                        {
                            mPoint.Y[i] = (int)package.Item[i + 2].Value;
                        }
                        ;
                        mPoints.Add(mPoint);
                    }
                    //Debug.Print(mPoints.Count.ToString());
                    if (mPoints.Count == 0)
                    {
                        return null;
                    }

                    MPoints points = new MPoints(mPoints.Count);
                    for (int i = 0; i < mPoints.Count; i++)
                    {
                        points[i] = mPoints[i];
                    }



                    //Выборка первой и последней даты в блоке
                    mPointsOut.X[0] = points.X.First();
                    mPointsOut.X[1] = points.X.Last();

                    //Выборка минимальных и максимальных Y значений
                    for (int g = 0; g < mPointsOut.Y.Length; g++)
                    {
                        mPointsOut.Y[g].Value[0] = points.Y[g].Value.Min();
                        mPointsOut.Y[g].Value[1] = points.Y[g].Value.Max();
                    }
                    return mPointsOut;
                }
            }
                                  ));
        }