Как реализовать класс Barrier из функциональности .NET 4 в .NET 3.5

По некоторым причинам я должен придерживаться .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

И все. После последней строки больше нет вывода, и приложение не закрывается. Похоже, что это какой-то тупик. Однако не могу найти проблему. Любая помощь приветствуется.

Спасибо!

7
задан Community 23 May 2017 в 11:53
поделиться