void SampleAvailableEventHandler(List<byte[]> datas)
 {
     if (datas != null &&datas.Count > 0)
     {
         UdpPacket packet = new UdpPacket(Me.Id, RoomVM.Id, UdpPacketType.Data);
         foreach (var d in datas)
         {
             packet.Append(d);
         }
         AsyncBeginAudioSend(packet.ToBytes());
     }
 }
 private void ConnectAudio()
 {
     audioClient.Connect(RoomVM.ServiceIp, ApplicationVM.LocalCache.RoomAudioServicePort);
     UdpPacket packet = new UdpPacket(Me.Id, RoomVM.Id, UdpPacketType.Login);
     var loginBytes = packet.ToBytes();
     try
     {
         audioRWLock.EnterWriteLock();
         while (true)
         {
             try
             {
                 audioClient.Send(loginBytes, loginBytes.Length);
                 IPEndPoint serverEndPoint = null;
                 var bytes = audioClient.Receive(ref serverEndPoint);
                 UdpPacket p = UdpPacket.FromBytes(bytes);
                 if (p.PacketType == UdpPacketType.LoginSucceed)
                 {
                     break;
                 }
             }
             catch
             {
                 continue;
             }
         }
     }
     catch { }
     finally
     {
         audioRWLock.ExitWriteLock();
     }
     AsyncBeginAudioReceive();
 }
        private void DisconnectAudio()
        {
            UdpPacket packet = new UdpPacket(Me.Id, RoomVM.Id, UdpPacketType.Logoff);
            var logoffBytes = packet.ToBytes();

            if (audioClient != null)
            {
                if (audioClient.Client.Connected)
                {
                    try
                    {
                        audioRWLock.EnterWriteLock();
                        while (true)
                        {
                            try
                            {
                                if (audioClient != null)
                                {
                                    audioClient.Send(logoffBytes, logoffBytes.Length);
                                    IPEndPoint serverEndPoint = null;
                                    var bytes = audioClient.Receive(ref serverEndPoint);
                                    UdpPacket p = UdpPacket.FromBytes(bytes);
                                    if (p.PacketType == UdpPacketType.LogoffSuccedd)
                                    {
                                        break;
                                    }
                                }
                                else
                                    break;
                            }
                            catch
                            {
                                continue;
                            }
                        }
                        if(audioClient != null)
                            audioClient.Close();
                    }
                    catch { }
                    finally
                    {
                        audioClient = null;
                        audioRWLock.ExitWriteLock();
                    }
                }
                
            }
        }