PostSharp.Samples / PostSharp.Samples.Threading.PingPong
Project Description

This example implements the classic ping-pong game between two players using actors.

The players are represented by the Player class. Each player has a skill level between 0 and 1, equal to the probability to successfully receive a ball. The Ping method evaluate this probability for the current player and, in case of success, calls the Ping method for the peer player.

To make the example more interesting and truly multi-threaded, we are introducing several balls in the game, each of a different color.

As an additional funny requirement, we want to display a colored message to the console every time a player handles the ball. Since writing a message in a given color using System.Console take two calls (one to Console.ForegroundColor and one to Console.WriteLine), which must be done atomically, we would be tempted to use a lock. But the whole point of threading models is to avoid using locks, so let's be more creative and do an API that wraps System.Console and makes it an actor too! This is actually a very good idea: any intrinsically single-threaded device or "process" is a good candidate for an actor.