public async Task Add_ReadIsLocked_ShorterThenTimeout() { // Arrange var id = 1; var item = new MockEntity(id); // Act using (var testRunThreadEvent = new AutoResetEvent(false)) { using (var lockerRunThreadEvent = new AutoResetEvent(false)) { ThreadPool.QueueUserWorkItem(s => { _accessLock.EnterReadLock(); testRunThreadEvent.Set(); lockerRunThreadEvent.WaitOne(); _accessLock.ExitReadLock(); testRunThreadEvent.Set(); // Lock thread to avoid run Add task in this thread lockerRunThreadEvent.WaitOne(); }); testRunThreadEvent.WaitOne(); var addTask = _testObject.Add(item, TimeSpan.FromSeconds(1)); lockerRunThreadEvent.Set(); testRunThreadEvent.WaitOne(); await addTask; // Assert Assert.Single(_internalStorageItems.Keys); Assert.Equal(id, _internalStorageItems.Keys.First()); Assert.Single(_internalStorageItems.Values); Assert.Equal(item, _internalStorageItems.Values.First()); lockerRunThreadEvent.Set(); } } }