18.8. Using Events to Make Threads Cooperate
Problem
You have multiple threads that need to be served by a server, but only one can be served at a time.
Solution
Use an AutoResetEvent to notify each thread when it is going to be served. For example, a diner has a cook and multiple waitresses. The waitresses can keep bringing in orders, but the cook can serve up only one at a time. You can simulate this with the Cook class shown in Recipe 18.8.
Example 18-11. Using events to make threads cooperate
public class Cook
{
public static AutoResetEvent OrderReady = new AutoResetEvent(false);
public void CallWaitress( )
{
// We call Set on the AutoResetEvent and don't have to
// call Reset like we would with ManualResetEvent to fire it
// off again. This sets the event that the waitress is waiting for
// in PlaceOrder.
OrderReady.Set( );
}
}The Cook class has an AutoResetEvent called OrderReady that the cook will use to tell the waiting waitresses that an order is ready. Since there is only one order ready at a time, and this is an equal-opportunity diner, the waitress who has been waiting longest gets her order first. The AutoResetEvent allows for just signaling the single thread when you call Set on the OrderReady event.
The Waitress class has the PlaceOrder method that is executed by the thread. PlaceOrder takes an object parameter, which is passed in from the call to t.Start in the next code block. The Start method uses a ParameterizedThreadStart delegate, which takes an object parameter. ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access