private void Deserialize(BlockingPipelineStream stream, List <IAnimal> animals) { lock (stream.ReadSync) { animals.Add(Serializer.DeserializeWithLengthPrefix <IAnimal>(stream, PrefixStyle.Fixed32BigEndian)); } }
private void Serialize(BlockingPipelineStream stream, int index) { lock (stream.WriteSync) { Serializer.SerializeWithLengthPrefix(stream, _animals[index], PrefixStyle.Fixed32BigEndian); } }
public void ReadWrite_OnMultipleThreads_ShouldWork(int writeTasksCount, int readTasksCount, bool notTimedOutExpected, bool zeroLenghtExpected) { // Assign var stream = new BlockingPipelineStream(); var writeTasks = Enumerable.Range(1, writeTasksCount) .Select(i => new Task(() => stream.Write(CreateRandomBytes(i * 10), 0, i * 10), TaskCreationOptions.LongRunning)) .ToList(); var readTasks = Enumerable.Range(1, readTasksCount) .Select(i => new Task(() => stream.Read(new byte[i * 10], 0, i * 10), TaskCreationOptions.LongRunning)) .ToList(); // Act readTasks.ForEach(x => x.Start()); writeTasks.ForEach(x => x.Start()); var tasks = writeTasks.Concat(readTasks).ToArray(); var notTimedOut = Task.WaitAll(tasks, 1000); // Assert Assert.Equal(notTimedOutExpected, notTimedOut); Assert.Equal(zeroLenghtExpected, stream.Length == 0); }
public void ReadWrite_WithProtocolBuffers_ShouldWork(int writeTasksCount, int readTasksCount, bool notTimedOutExpected, int animalsExpected) { // Assign var stream = new BlockingPipelineStream(); var animals = new List <IAnimal>(); var writeTasks = Enumerable.Range(0, writeTasksCount) .Select(i => new Task(() => Serialize(stream, i), TaskCreationOptions.LongRunning)) .ToList(); var readTasks = Enumerable.Range(0, readTasksCount) .Select(i => new Task(() => Deserialize(stream, animals), TaskCreationOptions.LongRunning)) .ToList(); // Act readTasks.ForEach(x => x.Start()); writeTasks.ForEach(x => x.Start()); var tasks = writeTasks.Concat(readTasks).ToArray(); var notTimedOut = Task.WaitAll(tasks, 1000); // Assert Assert.Equal(notTimedOutExpected, notTimedOut); Assert.Equal(animalsExpected, animals.Count); }