Process queue with multithreading or tasks

前端 未结 2 1504
花落未央
花落未央 2020-11-29 05:46

I have a telephony message application in which there are many many messages to be processed.Because telephone ports are limited, so the message will be processed first in f

2条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-29 06:14

    Parallel.ForEach from TPL. It's parallel for-each.

    Sample (changed MessageWorkItem to generic Queue):

        public class MessageQueue
    {
        public Queue MessageWorkItem { get; set; }
    
        public MessageQueue()
        {
            MessageWorkItem = new Queue();
        }
    
        public Message GetMessageMetaData()
        {
            try
            {
                // It is just a test, add only one item into the queue
                return new Message()
                {
                    MessageID = Guid.NewGuid(),
                    NumberToCall = "1111111111",
                    FacilityID = "3333",
                    NumberToDial = "2222222222",
                    CountryCode = "1",
                    Acknowledge = false
                };
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    
        public void AddingItemToQueue()
        {
            var message = GetMessageMetaData();
            if (!message.Acknowledge)
            {
                lock (MessageWorkItem)
                {
                    MessageWorkItem.Enqueue(message);
                }
            }
        }
    }
    
    public class Message
    {
        public Guid MessageID { get; set; }
        public string NumberToCall { get; set; }
        public string FacilityID { get; set; }
        public string NumberToDial { get; set; }
        public string CountryCode { get; set; }
        public bool Acknowledge { get; set; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            MessageQueue me = new MessageQueue();
            for (int i = 0; i < 10000; i++)
                me.AddingItemToQueue();
    
            Console.WriteLine(me.MessageWorkItem.Count);
    
            Parallel.ForEach(me.MessageWorkItem, RunScript);
        }
    
        static void RunScript(Message item)
        {
            // todo: ...
            Console.WriteLine(item.MessageID);
            Thread.Sleep(300);
        }
    }
    

提交回复
热议问题