private void ReceiveThreadEntry()
        {
            try
            {
                OnFrameReceivedCallback callback = new OnFrameReceivedCallback(OnFrameReceived);

                byte[] readBuffer = new byte[maxBufferReadSize];

                int isJpegStartFound = -1;

                int actualData   = 0;
                int bufferOffset = 0;
                int savedOffset  = 0;

                //Парсер http-ответа
                var fileCount = 1;
                while (true)
                {
                    int readen = ReadFromInet(readBuffer, actualData, maxBufferReadSize);

                    if (readen > 0)
                    {
                        File.AppendAllText($@"Files\read.txt", $@"try read {maxBufferReadSize - actualData} from {actualData} of max {maxBufferReadSize} {Environment.NewLine}");
                        actualData += readen;
                        File.AppendAllText($@"Files\read.txt", $@"read {readen} - actualData - {actualData} bufferOffset - {bufferOffset} {Environment.NewLine}");

                        if (actualData - savedOffset > maxBufferlogSize)
                        {
                            byte[] readed = new byte[maxBufferlogSize];

                            Array.Copy(readBuffer, savedOffset, readed, 0, maxBufferlogSize);

                            File.WriteAllBytes($@"Files\Streams\1Stream{fileCount}.txt", readed);
                            ++fileCount;
                            savedOffset += maxBufferlogSize;
                        }


                        if (actualData >= maxBufferReadSize)
                        {
                            actualData -= bufferOffset;
                            File.AppendAllText($@"Files\read.txt", $@"ovf actualData - {actualData} bufferOffset - {bufferOffset} {Environment.NewLine}");


                            //Application.Current.Dispatcher.BeginInvoke(callback, new object[] { readed, true });

                            Array.Copy(readBuffer, bufferOffset, readBuffer, 0, actualData);
                            bufferOffset = 0;
                            File.AppendAllText($@"Files\read.txt", $@"ovf new actualData - {actualData} bufferOffset - {bufferOffset} {Environment.NewLine}");
                        }
                    }

                    if (isJpegStartFound == -1)
                    {
                        for (; bufferOffset + 6 <= actualData; bufferOffset++)
                        {
                            if (
                                readBuffer[bufferOffset] == '\r' &&
                                readBuffer[bufferOffset + 1] == '\n' &&
                                readBuffer[bufferOffset + 2] == '\r' /*0xFF*/ &&
                                readBuffer[bufferOffset + 3] == '\n' /*0xD8*/)
                            {
                                isJpegStartFound = bufferOffset;
                                break;
                            }
                            else if (readBuffer[bufferOffset] == 0x49 &&     /*I*/
                                     readBuffer[bufferOffset + 1] == 0x2D && /*-*/
                                     readBuffer[bufferOffset + 2] == 0x66 && /*f*/
                                     readBuffer[bufferOffset + 3] == 0x72 && /*r*/
                                     readBuffer[bufferOffset + 4] == 0x61 && /*a*/
                                     readBuffer[bufferOffset + 5] == 0x6D && /*m*/
                                     readBuffer[bufferOffset + 6] == 0x65)   /*e*/
                            {
                                isIFrame = true;
                            }
                        }
                    }
                    else
                    {
                        for (; bufferOffset + 3 <= actualData; bufferOffset++)
                        {
                            if (
                                readBuffer[bufferOffset] == 0x2D &&     /*-*/
                                readBuffer[bufferOffset + 1] == 0x2D && /*-*/
                                readBuffer[bufferOffset + 2] == 0x6D && /*m*/
                                readBuffer[bufferOffset + 3] == 0x79)   /*y*/
                            {
                                int frameSize = bufferOffset - isJpegStartFound;

                                if (frameSize > 0)
                                {
                                    byte[] frame = new byte[frameSize];
                                    Array.Copy(readBuffer, isJpegStartFound, frame, 0, frameSize);
                                    Application.Current.Dispatcher.BeginInvoke(callback, new object[] { frame, isIFrame ? true : false });
                                    isIFrame = false;
                                }

                                isJpegStartFound = -1;
                                bufferOffset++;
                                break;
                            }
                            else if (
                                readBuffer[bufferOffset] == '\r' &&
                                readBuffer[bufferOffset + 1] == '\n' &&
                                readBuffer[bufferOffset + 2] == '\r' /*0xFF*/ &&
                                readBuffer[bufferOffset + 3] == '\n' /*0xD8*/)
                            {
                                isJpegStartFound = bufferOffset;
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                MessageBox.Show(ex.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        private void WorkerThreadEntry()
        {
            try
            {
                OnFrameReceivedCallback callback = new OnFrameReceivedCallback(OnFrameReceived);

                HttpWebResponse webResponse    = (HttpWebResponse)webRequest.GetResponse();
                Stream          streamResponse = webResponse.GetResponseStream();

                int    maxBufferSize = 32 * 1024 * 1024;
                byte[] readBuffer    = new byte[maxBufferSize];

                int isJpegStartFound = -1;

                int actualData   = 0;
                int bufferOffset = 0;

                //Парсер http-ответа
                while (true)
                {
                    int readen = streamResponse.Read(readBuffer, actualData, maxBufferSize - actualData);

                    if (readen == 0)
                    {
                        return;
                    }

                    actualData += readen;

                    if (actualData == maxBufferSize)
                    {
                        actualData -= bufferOffset;

                        Array.Copy(readBuffer, bufferOffset, readBuffer, 0, actualData);
                        bufferOffset = 0;
                    }

                    if (isJpegStartFound == -1)
                    {
                        for (; bufferOffset + 2 < actualData; bufferOffset++)
                        {
                            if (readBuffer[bufferOffset] == '\r' && readBuffer[bufferOffset + 1] == '\n' && readBuffer[bufferOffset + 2] == 0xFF && readBuffer[bufferOffset + 3] == 0xD8)
                            {
                                isJpegStartFound = bufferOffset;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (; bufferOffset + 1 < actualData; bufferOffset++)
                        {
                            if (readBuffer[bufferOffset] == 0xFF && readBuffer[bufferOffset + 1] == 0xD9)
                            {
                                int frameSize = bufferOffset - isJpegStartFound + 2;

                                byte[] frame = new byte[frameSize];

                                Array.Copy(readBuffer, isJpegStartFound, frame, 0, frameSize);

                                Application.Current.Dispatcher.BeginInvoke(callback, new object[] { frame });

                                isJpegStartFound = -1;
                                bufferOffset++;
                                break;
                            }
                            else if (readBuffer[bufferOffset] == 0xFF && readBuffer[bufferOffset + 1] == 0xD8)
                            {
                                isJpegStartFound = bufferOffset;
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }