public void Dispose()
        {
            if (_isDisposed) return;

            _isDisposed = true;

            // shut down our loopback thread
            if (_loopbackBufferFilledEvent != null)
            {
                _loopbackBufferFilledEvent.Set();
                _loopbackBufferFilledEvent = null;
            }

            _ethernetInterface = null;
            _ipv4HeaderBuffer = null;
            _ipv4HeaderBufferLockObject = null;

            _dhcpv4Client.Dispose();
            _dhcpv4Client = null;

            _icmpv4Handler.Dispose();
            _icmpv4Handler = null;

            _dnsResolver.Dispose();
            _dnsResolver = null;

            _tcpHandler.Dispose();
            _tcpHandler = null;

            _bufferArray = null;
            _indexArray = null;
            _countArray = null;
        }