コード例 #1
0
        protected override IEnumerable <Task> GetTasks()
        {
            _udp = new UdpClient(new IPEndPoint(IPAddress.Any, 0));

            VoiceLoginCommand msg = new VoiceLoginCommand();

            msg.Payload.ServerId  = _serverId;
            msg.Payload.SessionId = _sessionId;
            msg.Payload.Token     = _token;
            msg.Payload.UserId    = _userId;
            QueueMessage(msg);

            List <Task> tasks = new List <Task>();

            if ((_client.Config.VoiceMode & DiscordVoiceMode.Outgoing) != 0)
            {
                _sendThread = new Thread(new ThreadStart(() => SendVoiceAsync(_cancelToken)));
                _sendThread.IsBackground = true;
                _sendThread.Start();
            }

            //This thread is required to establish a connection even if we're outgoing only
            if ((_client.Config.VoiceMode & DiscordVoiceMode.Incoming) != 0)
            {
                _receiveThread = new Thread(new ThreadStart(() => ReceiveVoiceAsync(_cancelToken)));
                _receiveThread.IsBackground = true;
                _receiveThread.Start();
            }
            else             //Dont make an OS thread if we only want to capture one packet...
            {
                tasks.Add(Task.Run(() => ReceiveVoiceAsync(_cancelToken)));
            }

            tasks.Add(WatcherAsync());
            if (tasks.Count > 0)
            {
                // We need to combine tasks into one because receiveThread is
                // supposed to exit early if it's an outgoing-only client
                // and we dont want the main thread to think we errored
                var task = Task.WhenAll(tasks);
                tasks.Clear();
                tasks.Add(task);
            }
            tasks.AddRange(base.GetTasks());

            return(new Task[] { Task.WhenAll(tasks.ToArray()) });
        }
コード例 #2
0
		protected override IEnumerable<Task> GetTasks()
		{			
			_udp = new UdpClient(new IPEndPoint(IPAddress.Any, 0));

			VoiceLoginCommand msg = new VoiceLoginCommand();
			msg.Payload.ServerId = _serverId;
			msg.Payload.SessionId = _sessionId;
			msg.Payload.Token = _token;
			msg.Payload.UserId = _userId;
			QueueMessage(msg);

			List<Task> tasks = new List<Task>();
			if ((_client.Config.VoiceMode & DiscordVoiceMode.Outgoing) != 0)
			{
				_sendThread = new Thread(new ThreadStart(() => SendVoiceAsync(_cancelToken)));
				_sendThread.IsBackground = true;
                _sendThread.Start();
			}
			
			//This thread is required to establish a connection even if we're outgoing only
			if ((_client.Config.VoiceMode & DiscordVoiceMode.Incoming) != 0)
			{
				_receiveThread = new Thread(new ThreadStart(() => ReceiveVoiceAsync(_cancelToken)));
				_receiveThread.IsBackground = true;
				_receiveThread.Start();
			}
			else //Dont make an OS thread if we only want to capture one packet...
				tasks.Add(Task.Run(() => ReceiveVoiceAsync(_cancelToken)));
			
			tasks.Add(WatcherAsync());
			if (tasks.Count > 0)
			{
				// We need to combine tasks into one because receiveThread is 
				// supposed to exit early if it's an outgoing-only client
				// and we dont want the main thread to think we errored
				var task = Task.WhenAll(tasks);
				tasks.Clear();
				tasks.Add(task);
			}
			tasks.AddRange(base.GetTasks());
			
			return new Task[] { Task.WhenAll(tasks.ToArray()) };
		}