public void TestCallOrder3() { var subject = new OrderedInterface(); const int servantId = 20; _server.CreateServant(servantId, (IOrderInterface)subject); var proxy = _client.CreateProxy <IOrderInterface>(servantId); List <int> sequence = Enumerable.Range(0, 1000).ToList(); Action fn = () => { while (true) { int next; lock (sequence) { if (sequence.Count == 0) { break; } next = sequence[0]; sequence.RemoveAt(0); } proxy.TypeOrdered(next); } }; var tasks = new[] { Task.Factory.StartNew(fn), Task.Factory.StartNew(fn), Task.Factory.StartNew(fn), Task.Factory.StartNew(fn), Task.Factory.StartNew(fn), Task.Factory.StartNew(fn) }; Task.WaitAll(tasks); subject.TypeOrderedSequence.Should().BeEquivalentTo( Enumerable.Range(0, 1000).ToList(), "Because the proxy calls are not necessarily ordered, its invocations aren't either." ); }
public void TestCallOrder1() { var subject = new OrderedInterface(); const int servantId = 18; _server.CreateServant(servantId, (IOrderInterface)subject); var proxy = _client.CreateProxy <IOrderInterface>(servantId); for (int i = 0; i < 1000; ++i) { proxy.Unordered(i); } subject.UnorderedSequence.Should().Equal( Enumerable.Range(0, 1000).ToList(), "Because synchronous calls made from the same thread are guarantueed to be executed in order" ); }
public void TestCallOrder2() { var subject = new OrderedInterface(); const int servantId = 19; _server.CreateServant(servantId, (IOrderInterface)subject); var proxy = _client.CreateProxy <IOrderInterface>(servantId); List <int> sequence = Enumerable.Range(0, 1000).ToList(); Action fn = () => { while (true) { lock (sequence) { if (sequence.Count == 0) { break; } int next = sequence[0]; sequence.RemoveAt(0); proxy.Unordered(next); } } }; var tasks = new[] { Task.Factory.StartNew(fn), Task.Factory.StartNew(fn) }; Task.WaitAll(tasks); subject.UnorderedSequence.Should().Equal( Enumerable.Range(0, 1000).ToList(), "Because synchronous calls are executed in the same sequence they are given, independent of the calling thread" ); }