private void BackgroundThreadFunc() { while (!_backgroundThreadStop) { bool shouldSleep = true; lock (QueueLock) { if (_packetQueue.Count != 0) { shouldSleep = false; } } if (shouldSleep) { System.Threading.Thread.Sleep(250); } else { List <RawCapture> ourQueue; lock (QueueLock) { ourQueue = _packetQueue; _packetQueue = new List <RawCapture>(); } foreach (var packet in ourQueue) { // Здесь мы можем обрабатывать пакеты свободно, не занимая перехватываемое устройство var packetWrapper = new PacketWrapper(_packetCount, packet); packetStrings.Enqueue(packetWrapper); _packetCount++; } _view.BeginInvoke(bs, packetStrings); if (statisticsUiNeedsUpdate) { UpdateCaptureStatistics(); statisticsUiNeedsUpdate = false; } } } }