예제 #1
0
		public void MicroStressTest()
		{
			// Run a bunch of concurrent reads and writes, make sure we get no exceptions
			var imc = new EntityFrameworkCache(100);
			const int NumberOfRequestBatches = 50; // will be multiplied by 5 (3 readers + 1 writer + 1 invalidator)
			const int NumberOfIterationsPerThread = 100;

			var startEvent = new ManualResetEvent(false);

			Action writer = () =>
			{
				startEvent.WaitOne();
				var random = new Random();

				for (var i = 0; i < NumberOfIterationsPerThread; ++i)
				{
					var randomKey = Guid.NewGuid().ToString("N").Substring(0, 4);
					var randomValue = randomKey + "_V";
					var dependentSets = new List<string>();
					var numberOfDependencies = random.Next(5);

					for (var j = 0; j < numberOfDependencies; ++j)
					{
						var randomSetName = new string((char)('A' + random.Next(26)), 1);
						dependentSets.Add(randomSetName);
					}

					imc.PutItem(randomKey, randomValue, dependentSets, TimeSpan.Zero, DateTime.MaxValue);
				}
			};

			Action invalidator = () =>
			{
				startEvent.WaitOne();
				var random = new Random();

				for (var i = 0; i < NumberOfIterationsPerThread; ++i)
				{
					var dependentSets = new List<string>();
					var numberOfDependencies = random.Next(5);
					for (var j = 0; j < numberOfDependencies; ++j)
					{
						var randomSetName = new string((char)('A' + random.Next(26)), 1);
						dependentSets.Add(randomSetName);
					}

					imc.InvalidateSets(dependentSets);
				}
			};

			Action reader = () =>
			{
				startEvent.WaitOne();

				for (var i = 0; i < NumberOfIterationsPerThread; ++i)
				{
					var randomKey = Guid.NewGuid().ToString("N").Substring(0, 4);
					object value;

					if (imc.GetItem(randomKey, out value))
					{
						Assert.AreEqual(randomKey + "_V", value);
					}
				}
			};

			var threads = new List<Thread>();

			for (var i = 0; i < NumberOfRequestBatches; ++i)
			{
				threads.Add(new Thread(() => writer()));
				threads.Add(new Thread(() => invalidator()));
				threads.Add(new Thread(() => reader()));
				threads.Add(new Thread(() => reader()));
				threads.Add(new Thread(() => reader()));
			}

			foreach (var t in threads)
			{
				t.Start();
			}

			startEvent.Set();

			foreach (var t in threads)
			{
				t.Join();
			}
		}
예제 #2
0
		public void DependenciesTest4()
		{
			var imc = new EntityFrameworkCache();

			imc.PutItem("A", "A1", new[] { "set1" }, TimeSpan.Zero, DateTime.MaxValue);
			imc.PutItem("B", "B1", new[] { "set1", "set2" }, TimeSpan.Zero, DateTime.MaxValue);
			imc.PutItem("C", "C1", new[] { "set2", "set3" }, TimeSpan.Zero, DateTime.MaxValue);
			imc.PutItem("D", "D1", new[] { "set3", "set1" }, TimeSpan.Zero, DateTime.MaxValue);

			Assert.AreEqual("D|C|B|A", GetItemKeysInLruOrder(imc));
			imc.PutItem("B", "C1", new[] { "set3" }, TimeSpan.Zero, DateTime.MaxValue);
			Assert.AreEqual("B|D|C|A", GetItemKeysInLruOrder(imc));

			imc.InvalidateSets(new[] { "set3" });
			Assert.AreEqual("A", GetItemKeysInLruOrder(imc));
		}