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. }
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); }
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); }