public void GetOrAddWithCacheHitTest() { // Arrange // Arrange var invocationCount = 0; Func<int, string> valueFactory = k => { invocationCount++; return Convert.ToString(k); }; var cache = new LockOnWriteCache<int, string>(); // Act cache.GetOrAdd(1, valueFactory); var value = cache.GetOrAdd(1, valueFactory); // Assert Assert.That(value, Is.EqualTo("1")); Assert.That(invocationCount, Is.EqualTo(1)); }
public void GetOrAddWithCacheHitTest() { // Arrange // Arrange var invocationCount = 0; Func <int, string> valueFactory = k => { invocationCount++; return(Convert.ToString(k)); }; var cache = new LockOnWriteCache <int, string>(); // Act cache.GetOrAdd(1, valueFactory); var value = cache.GetOrAdd(1, valueFactory); // Assert Assert.That(value, Is.EqualTo("1")); Assert.That(invocationCount, Is.EqualTo(1)); }
public void GetOrAddWithoutCacheHitAndConcurrencyTest() { // Arrange var monitor = new Object(); var invocationCount = 0; Func<int, string> valueFactory = k => { lock (monitor) { Monitor.Wait(monitor); } invocationCount++; return Convert.ToString(k); }; var cache = new LockOnWriteCache<int, string>(); // Act var firstTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory)); var secondTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory)); firstTask.Wait(500); secondTask.Wait(500); Assert.That(firstTask.IsCompleted, Is.False); Assert.That(secondTask.IsCompleted, Is.False); lock (monitor) { Monitor.Pulse(monitor); } Task.WaitAll(firstTask, secondTask); // Assert Assert.That(firstTask.Result, Is.EqualTo("1")); Assert.That(secondTask.Result, Is.EqualTo("1")); Assert.That(invocationCount, Is.EqualTo(1)); }
public void GetOrAddWithoutCacheHitAndConcurrencyTest() { // Arrange var monitor = new Object(); var invocationCount = 0; Func <int, string> valueFactory = k => { lock (monitor) { Monitor.Wait(monitor); } invocationCount++; return(Convert.ToString(k)); }; var cache = new LockOnWriteCache <int, string>(); // Act var firstTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory)); var secondTask = Task.Factory.StartNew(() => cache.GetOrAdd(1, valueFactory)); firstTask.Wait(500); secondTask.Wait(500); Assert.That(firstTask.IsCompleted, Is.False); Assert.That(secondTask.IsCompleted, Is.False); lock (monitor) { Monitor.Pulse(monitor); } Task.WaitAll(firstTask, secondTask); // Assert Assert.That(firstTask.Result, Is.EqualTo("1")); Assert.That(secondTask.Result, Is.EqualTo("1")); Assert.That(invocationCount, Is.EqualTo(1)); }
/// <inheritdoc/> public IProxyTemplate GetProxyTemplate(Type declaringType, IEnumerable <Type> interfaceTypes) { if (declaringType == null) { throw new ArgumentNullException("declaringType"); } //if (interfaceTypes == null) // throw new ArgumentNullException("interfaceTypes"); // Create proxy definition. var proxyDefinition = CreateProxyDefinition(declaringType, interfaceTypes); // Get or generate proxy template. return(_proxyTemplateCache.GetOrAdd(proxyDefinition, GenerateProxyTemplate)); }