using System.Collections.Generic;
using System.Threading.Tasks;
public static void Main()
var chopsticks = new Dictionary<int, object>(n);
for (int i = 0; i < n; ++i)
chopsticks.Add(i, new object ());
Task[] myactions = new Task[n];
myactions[0] = new Task(() => Person.Eat(chopsticks[0], chopsticks[n - 1], 1, 1, n));
for (int i = 1; i < n; ++i)
myactions[j] = new Task(() => Person.Eat(chopsticks[j - 1], chopsticks[j], j++, j, j++));
Parallel.ForEach(myactions, t =>
Console.WriteLine("\nEveryone finished eating.");
static public void Eat(object leftchopstick, object rightchopstick, int personnumber, int leftchopsticknumber, int rightchopsticknumber)
Console.WriteLine("Person {0} picked chopstick number {1}", personnumber, leftchopsticknumber);
Console.WriteLine("Person {0} picked chopstick number {1}", personnumber, rightchopsticknumber);
Console.WriteLine("Person {0} eats", personnumber);
Console.WriteLine("Person {0} released chopstick number {1}", personnumber, rightchopsticknumber);
Console.WriteLine("Person {0} released chopstick number {1}", personnumber, rightchopsticknumber);