コード例 #1
0
        //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(); }
        }