using System;
using System.Threading;
public class Test
{
private static void MyFunc(AutoResetEvent ev)
{
Thread.Sleep((int)(new Random().NextDouble() * 1000));
ev.Set();
}
public static void Main()
{
AutoResetEvent[] evs = {new AutoResetEvent(false), new AutoResetEvent(false), new AutoResetEvent(false)};
Thread thread1 = new Thread(() => MyFunc(evs[0]));
Thread thread2 = new Thread(() => MyFunc(evs[1]));
Thread thread3 = new Thread(() => MyFunc(evs[2]));
thread1.Start();
thread2.Start();
thread3.Start();
int winner = WaitHandle.WaitAny(evs);
Console.WriteLine("The winner is thread{0}", winner + 1);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHJpdmF0ZSBzdGF0aWMgdm9pZCBNeUZ1bmMoQXV0b1Jlc2V0RXZlbnQgZXYpCgl7CgkJVGhyZWFkLlNsZWVwKChpbnQpKG5ldyBSYW5kb20oKS5OZXh0RG91YmxlKCkgKiAxMDAwKSk7CgkJZXYuU2V0KCk7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlBdXRvUmVzZXRFdmVudFtdIGV2cyA9IHtuZXcgQXV0b1Jlc2V0RXZlbnQoZmFsc2UpLCBuZXcgQXV0b1Jlc2V0RXZlbnQoZmFsc2UpLCBuZXcgQXV0b1Jlc2V0RXZlbnQoZmFsc2UpfTsKCQlUaHJlYWQgdGhyZWFkMSA9IG5ldyBUaHJlYWQoKCkgPT4gTXlGdW5jKGV2c1swXSkpOwoJICAgIFRocmVhZCB0aHJlYWQyID0gbmV3IFRocmVhZCgoKSA9PiBNeUZ1bmMoZXZzWzFdKSk7CgkgICAgVGhyZWFkIHRocmVhZDMgPSBuZXcgVGhyZWFkKCgpID0+IE15RnVuYyhldnNbMl0pKTsKCQoJICAgCXRocmVhZDEuU3RhcnQoKTsKCSAgIAl0aHJlYWQyLlN0YXJ0KCk7CgkgICAJdGhyZWFkMy5TdGFydCgpOwoKCQlpbnQgd2lubmVyID0gV2FpdEhhbmRsZS5XYWl0QW55KGV2cyk7CgkJCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRoZSB3aW5uZXIgaXMgdGhyZWFkezB9Iiwgd2lubmVyICsgMSk7Cgl9Cn0=