/** * Reads a queue string into and builds a transformation queue from it. */ public TransformationQueue Read(string _s, bool fromHash = false) { MatchCollection queueExist = TransformationQueue.queueExistParse.Matches(_s); if (queueExist.Count == 0) { throw new Exception("Cannot read queue string " + _s); } TransformationQueue tQueue = new TransformationQueue(); MatchCollection jobExist = TransformationQueue.queueEntryParse.Matches(_s); if (jobExist.Count == 0) { Log.Out("No jobs found."); return(tQueue); } foreach (Match matchJob in jobExist) { Log.Out("Matched: " + matchJob.ToString()); tQueue.Add(TransformationJob.Read(matchJob.ToString(), fromHash)); } return(tQueue); }
public void AddTakeSequentialTest() { const int ItemsCount = 50000; var memQueue = new MemoryQueue <long>(); var converter = new TypeConverter(); using (var queue = new TransformationQueue <int, long>(memQueue, converter)) using (var barrier = new Barrier(2)) { List <int> bag = new List <int>(); var task1 = Task.Run(() => { barrier.SignalAndWait(); for (int val = 0; val < ItemsCount; val++) { if (val % 10 == 0) { queue.Add(val); } else if (val % 10 == 1) { Assert.IsTrue(queue.TryAdd(val)); } else if (val % 10 == 2) { Assert.IsTrue(queue.TryAdd(val, 1000)); } else if (val % 10 == 3) { Assert.IsTrue(queue.TryAdd(val, TimeSpan.FromSeconds(1))); } else if (val % 10 == 4) { Assert.IsTrue(queue.TryAdd(val, 1000, new CancellationToken())); } else if (val % 10 == 5) { queue.AddForced(val); } else { queue.Add(val, new CancellationToken()); } SpinWaitHelper.SpinWait(val % 16); } }); var task2 = Task.Run(() => { barrier.SignalAndWait(); for (int val = 0; val < ItemsCount; val++) { int res = 0; if (val % 10 == 0) { Assert.IsTrue(queue.TryTake(out res, 10000), "Value was expected 1"); } else if (val % 10 == 1) { Assert.IsTrue(queue.TryTake(out res, 10000, new CancellationToken()), "Value was expected 2"); } else { Assert.IsTrue(queue.TryTake(out res, TimeSpan.FromSeconds(10)), "Value was expected 3"); } bag.Add(res); SpinWaitHelper.SpinWait((val + 5) % 16); } }); Task.WaitAll(task1, task2); Assert.AreEqual(0, queue.Count); Assert.AreEqual(ItemsCount, bag.Count); for (int i = 0; i < bag.Count; i++) { Assert.AreEqual(i, bag[i], "i != bag[i]"); } Assert.AreEqual(0, memQueue.Count); Assert.AreEqual(ItemsCount, converter.ConvertNum); Assert.AreEqual(ItemsCount, converter.ConvertBackNum); } }