示例#1
0
        // Used for private chats, groups, supergroups and channels when they are referenced by ID
        private void WaitOneInternalLocked(long chatId)
        {
            ManualResetEvent mre = null;

            if (chatId > 0)
            {
                lock (QueueLock)
                {
                    if (RequestCounts.TryGetValue(chatId, out ChatRequestCount ChatRequestCount))
                    {
                        if (ChatRequestCount.GetRequestCount(PrivateChatIntervals) <= PrivateChatMaxBurst)
                        {
                            ChatRequestCount.Increment();
                            mre = WaitOneInternalUnlocked();
                        }
                        else
                        {
                            var requestItem = new ScheduledRequestItem(TimerIntervals, chatId);
                            PrivateChatQueue.AddLast(requestItem);
                            mre = requestItem.MRE;
                        }
                    }
                    else
                    {
                        RequestCounts.Add(chatId, new ChatRequestCount(1, PrivateChatIntervals));
                        mre = WaitOneInternalUnlocked();
                    }
                }
            }
            else
            {
                lock (QueueLock)
                {
                    if (RequestCounts.TryGetValue(chatId, out ChatRequestCount ChatRequestCount))
                    {
                        if (ChatRequestCount.GetRequestCount(GroupChatIntervals) <= GroupChatMaxBurst)
                        {
                            ChatRequestCount.Increment();
                            mre = WaitOneInternalUnlocked();
                        }
                        else
                        {
                            var requestItem = new ScheduledRequestItem(TimerIntervals, chatId);
                            GroupChatQueue.AddLast(requestItem);
                            mre = requestItem.MRE;
                        }
                    }
                    else
                    {
                        RequestCounts.Add(chatId, new ChatRequestCount(1, GroupChatIntervals));
                        mre = WaitOneInternalUnlocked();
                    }
                }
            }

            mre?.WaitOne();
            return;
        }
示例#2
0
        // Returns a ManualResetEvent if the request was enqueued or null if it can be executed immediately
        private ManualResetEvent WaitOneInternalUnlocked()
        {
            ManualResetEvent mre;

            if (GeneralRequestCount <= GeneralMaxBurst)
            {
                GeneralRequestCount++;
                return(null);
            }
            else
            {
                var requestItem = new ScheduledRequestItem(TimerIntervals);
                GeneralQueue.AddLast(requestItem);
                mre = requestItem.MRE;
            }
            return(mre);
        }
示例#3
0
        private LinkedListNode <ScheduledRequestItem> InsertToGeneralQueue(ScheduledRequestItem requestItem, LinkedListNode <ScheduledRequestItem> searchFrom)
        {
            var node = searchFrom;

            while (node != null && requestItem.TimerIntervalWhenAdded > node.Value.TimerIntervalWhenAdded)
            {
                node = node.Next;
            }

            if (node == null)
            {
                return(GeneralQueue.AddLast(requestItem));
            }
            else
            {
                return(GeneralQueue.AddBefore(node, requestItem));
            }
        }