private LeveledTask addTask(ref ConcurrentDictionary <string, ConcurrentDictionary <string, long> > allresult,
                                    TaskParameters taskP,
                                    string q,
                                    int maxSleep,
                                    bool IsHighPrority = false)
        {
            var result = allresult;

            LeveledTask lt = new LeveledTask((param) =>
            {
                var p = param as TaskParameters;

                var resultQ = result.GetOrAdd(p.Q, new ConcurrentDictionary <string, long>());
                resultQ.AddOrUpdate(string.Concat("S", p.Seq), DateTime.UtcNow.Ticks, (key, current) => { throw new InvalidOperationException("Found existing key"); });
                //Trace.WriteLine(string.Format("Task {0} on Queue {1} - Start", p.Seq, p.Q), "info");
                Thread.Sleep(maxSleep);
                //Trace.WriteLine(string.Format("Task {0} on Queue {1} - End", p.Seq, p.Q), "info");
                resultQ.AddOrUpdate(string.Concat("E", p.Seq), DateTime.UtcNow.Ticks, (key, current) => { throw new InvalidOperationException("Found existing key"); });
            },
                                             taskP);


            lt.QueueId        = q;
            lt.IsHighPriority = IsHighPrority;
            lt.Start(scheduler);

            return(lt);
        }
        public void AsyncAsync()
        {
            var maxQueue      = 10;
            var maxTasks      = 5000;
            var maxSleep      = 10;
            var IsHighPrority = false;
            var result        = new ConcurrentDictionary <string, ConcurrentDictionary <string, long> >();
            var sw            = new Stopwatch();

            sw.Start();


            var Tasks = new List <Task>();


            for (var qNum = 1; qNum <= maxQueue; qNum++)
            {
                var qName = string.Concat("Q", qNum);
                for (var Seq = 1; Seq < maxTasks / maxQueue; Seq++)
                {
                    var taskP = new TaskParameters()
                    {
                        Q = qName, Seq = Seq
                    };

                    LeveledTask lt = new LeveledTask(async(param) =>
                    {
                        // this force the new task not to be inlined.

                        await Task.Factory.StartNew(async() => { await Task.Delay(100); }, TaskCreationOptions.LongRunning);
                        var p = param as TaskParameters;

                        var resultQ = result.GetOrAdd(p.Q, new ConcurrentDictionary <string, long>());
                        resultQ.AddOrUpdate(string.Concat("S", p.Seq), DateTime.UtcNow.Ticks, (key, current) => { throw new InvalidOperationException("Found existing key"); });
                        //Trace.WriteLine(string.Format("Task {0} on Queue {1} - Start", p.Seq, p.Q), "info");
                        Thread.Sleep(maxSleep);
                        //Trace.WriteLine(string.Format("Task {0} on Queue {1} - End", p.Seq, p.Q), "info");
                        resultQ.AddOrUpdate(string.Concat("E", p.Seq), DateTime.UtcNow.Ticks, (key, current) => { throw new InvalidOperationException("Found existing key"); });
                    },
                                                     taskP);

                    lt.QueueId        = qName;
                    lt.IsHighPriority = IsHighPrority;
                    lt.Start(scheduler);
                    Tasks.Add(lt);
                }
            }


            Task.WhenAll(Tasks).Wait();
            sw.Stop();
            Trace.WriteLine(string.Format("{0} Tasks on {1} Queues - Executed in {2} sec", maxTasks, maxQueue, sw.Elapsed.Seconds), "info");
            //verify(ref result);

            // tasks that uses normal start.run will lose order in the queue.
            // the only way that tasks maintain order is to by using
            // leveled tasks to create sub tasks.
        }
示例#3
0
        protected virtual Task makeSendTask(ArraySegment <byte> data,
                                            SocketMessageType messageType,
                                            bool EndOfMessage,
                                            bool isHighPriority)
        {
            var lt = new LeveledTask(() => m_SendAsync(data, (int)messageType, EndOfMessage, m_root_factory_working_token).Wait());

            lt.QueueId        = m_SessionId;
            lt.IsHighPriority = isHighPriority;
            lt.Start(m_Scheduler);
            return(lt);
        }
示例#4
0
        public virtual Task DrainThenClose()
        {
            // this posts a task at the end of
            // low priority task queue.

            // if a sender tries to send now
            // s/he might get a socket closing error
            // from the underlying OWIN
            var lt = new LeveledTask(
                () =>
            {
                Close().Wait();
            }
                );

            lt.QueueId        = m_SessionId;
            lt.IsHighPriority = false;
            lt.Start(m_Scheduler);
            return(lt);
        }
        public void Task_T()
        {
            var maxQueue      = 10;
            var maxTasks      = 5000;
            var maxSleep      = 10;
            var IsHighPrority = false;
            var result        = new ConcurrentDictionary <string, ConcurrentDictionary <string, long> >();
            var sw            = new Stopwatch();

            sw.Start();


            var Tasks = new List <Task <long> >();


            for (var qNum = 1; qNum <= maxQueue; qNum++)
            {
                var qName = string.Concat("Q", qNum);
                for (var Seq = 1; Seq < maxTasks / maxQueue; Seq++)
                {
                    var taskP = new TaskParameters()
                    {
                        Q = qName, Seq = Seq
                    };

                    LeveledTask <long> lt = new LeveledTask <long>((param) =>
                    {
                        // this force the new task not to be inlined.

                        var p = param as TaskParameters;

                        var resultQ = result.GetOrAdd(p.Q, new ConcurrentDictionary <string, long>());
                        resultQ.AddOrUpdate(string.Concat("S", p.Seq), DateTime.UtcNow.Ticks, (key, current) => { throw new InvalidOperationException("Found existing key"); });
                        //Trace.WriteLine(string.Format("Task {0} on Queue {1} - Start", p.Seq, p.Q), "info");
                        Thread.Sleep(maxSleep);
                        //Trace.WriteLine(string.Format("Task {0} on Queue {1} - End", p.Seq, p.Q), "info");
                        resultQ.AddOrUpdate(string.Concat("E", p.Seq), DateTime.UtcNow.Ticks, (key, current) => { throw new InvalidOperationException("Found existing key"); });

                        return(DateTime.Now.Ticks);
                    },
                                                                   taskP);

                    lt.QueueId        = qName;
                    lt.IsHighPriority = IsHighPrority;
                    lt.Start(scheduler);
                    Tasks.Add(lt);
                }
            }


            Task.WhenAll(Tasks).Wait();

            foreach (var task in Tasks)
            {
                Trace.WriteLine(String.Format("Task result was:{0} ", task.Result));
            }

            sw.Stop();
            Trace.WriteLine(string.Format("{0} Tasks on {1} Queues - Executed in {2} sec", maxTasks, maxQueue, sw.Elapsed.Seconds), "info");
            verify(ref result);
        }