По некоторым причинам я должен придерживаться .NET 3.5, и мне нужна функциональность класса Barrier из .NET 4. У меня есть несколько потоков, которые выполняют некоторую работу, и я хочу, чтобы они ждали друг друга, пока все не будут сделанный. Когда все будет готово, я хочу, чтобы они снова и снова выполняли работу аналогичным образом. Воодушевленный веткой Разница между Barrier в C # 4.0 и WaitHandle в C # 3.0? Я решил реализовать функциональность Barrier с помощью классов AutoResetEvent и WaitHandle. Хотя я столкнулся с проблемой с моим кодом:
class Program
{
const int numOfThreads = 3;
static AutoResetEvent[] barrier = new AutoResetEvent[numOfThreads];
static Random random = new Random(System.DateTime.Now.Millisecond);
static void barriers2(object barrierObj)
{
AutoResetEvent[] barrierLocal = (AutoResetEvent[])barrierObj;
string name = Thread.CurrentThread.Name;
for (int i = 0; i < 10; i++)
{
int sleepTime = random.Next(2000, 10000);
System.Console.Out.WriteLine("Thread {0} at the 'barrier' will sleep for {1}.", name, sleepTime);
Thread.Sleep(sleepTime);
System.Console.Out.WriteLine("Thread {0} at the 'barrier' with time {1}.", name, sleepTime);
int currentId = Convert.ToInt32(name);
//for(int z = 0; z < numOfThreads; z++)
barrierLocal[currentId].Set();
WaitHandle.WaitAll(barrier);
/*
for (int k = 0; k < numOfThreads; k++)
{
if (k == currentId)
{
continue;
}
System.Console.Out.WriteLine("Thread {0} is about to wait for the singla from thread: {1}", name, k);
barrierLocal[k].WaitOne();
System.Console.Out.WriteLine("Thread {0} is about to wait for the singla from thread: {1}. done", name, k);
}
*/
}
}
static void Main(string[] args)
{
for (int i = 0; i < numOfThreads; i++)
{
barrier[i] = new AutoResetEvent(false);
}
for (int i = 0; i < numOfThreads; i++)
{
Thread t = new Thread(Program.barriers2);
t.Name = Convert.ToString(i);
t.Start(barrier);
}
}
}
Я получаю следующий вывод:
Поток 0 на «барьере» будет спать 7564 Поток 1 на «барьере» будет спать 5123 Нить 2 на "барьере" будет спать 4237 Нить 2 у «барьера» со временем 4237 Поток 1 на «барьере» со временем 5123 Поток 0 на «барьере» со временем 7564 Поток 0 на «барьере» будет спать для 8641 Поток 0 на «барьере» со временем 8641
И все. После последней строки больше нет вывода, и приложение не закрывается. Похоже, что это какой-то тупик. Однако не могу найти проблему. Любая помощь приветствуется.
Спасибо!