This demo is intended to highlight the difference between requesting a service and providing one. The demo is based on two services: IntegerService and IndirectIntegerService.
interface IntegerService { Increment() => (int32 value); };
This trival interface just manages a single internal integer that's initialized to 0. The Increment() method returns a new value.
interface IndirectIntegerService { Set(IntegerService? service); Get(IntegerService&? service); };
This service delegates to the one IntegerService provided by the Set() method. Clients use Get() to request a connection to an IntegerService that targets the delegate. This is roughly an IntegerService “pointer”.
The demo creates a set of threads all of which get their own connection to the shared IntegerService via the IndirectIntegerService. The threads all access the IntegerService at the same time and then display a little table of the results.