//Async private async Task MessageQueueLoop() { var cancelToken = _disconnectToken.Token; try { Message msg; while (!cancelToken.IsCancellationRequested) { while (_pendingMessages.TryDequeue(out msg)) { bool hasFailed = false; APIResponses.SendMessage apiMsg = null; try { apiMsg = await _api.SendMessage(msg.ChannelId, msg.RawText, msg.MentionIds, msg.Nonce); } catch (WebException) { break; } catch (HttpException) { hasFailed = true; } if (!hasFailed) { _messages.Remap("nonce_", apiMsg.Id); _messages.Update(msg.Id, msg.ChannelId, apiMsg); } msg.IsQueued = false; msg.HasFailed = hasFailed; try { RaiseMessageSent(msg); } catch { } } await Task.Delay(_config.MessageQueueInterval); } } catch { } finally { _disconnectToken.Cancel(); } }