public void Disconnect()
        {
            // Socket.DisconnectAsync() is new in .NET 2.0 SP1
            // not available in original .NET 2.0

            SendSocketDataAvailableNotification = false;
            if (IsConnected)
            {
                try
                {
                    DisconnectDone.Reset();
                    SocketClient.BeginDisconnect(false, new AsyncCallback(DisconnectCallBack), SocketClient);
                    DisconnectDone.WaitOne();
                    SocketClient = null;
                    //if (OnEventMessage != null) { OnEventMessage(this, new EventSocketPortMessage(SocketPortMessageType.Disconnected)); }

#if FIRE_EVENT_BY_BEGININVOKE
                    if (OnEventMessage != null)
                    {
                        OnEventMessage.BeginInvoke(this, new SocketPortMessageEventArgs(SocketMessageType.Disconnected), null, null);
                    }
#else
                    if (OnEventMessage != null)
                    {
                        OnEventMessage(this, new SocketPortMessageEventArgs(SocketMessageType.Disconnected));
                    }
#endif
                }
#if DEBUG_SOCKET
                catch (Exception e)
                {
                    AccessoryLibrary.ShowException(e);
                    DisconnectDone.Set();
                }
#else
                catch (Exception ex)
                {
                    DisconnectDone.Set();
                    logger.Error(ex.ToString() + "\n");
                }
#endif
            }
        }