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()) }); }
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()) }; }