Создайте несколько потоков для работы, затем подождите, пока все не закончится - PullRequest
53 голосов
/ 27 марта 2010

просто нужен совет по "лучшей практике" в отношении многопоточных задач.

Например, у нас есть приложение на C #, которое при запуске считывает данные из различных таблиц типов в нашей базе данных и сохраняет информацию в коллекции, которую мы передаем приложению. это предотвращает попадание в базу данных каждый раз, когда требуется эта информация.

на данный момент приложение читает данные из 10 таблиц синхронно. Мне бы очень хотелось, чтобы приложение считывалось из каждой таблицы в отдельном потоке, работающем параллельно. приложение будет ожидать завершения всех потоков, прежде чем продолжить запуск приложения.

Я заглянул в BackGroundWorker, но просто хочу получить совет по выполнению вышеуказанного.

  1. Звучит ли метод логично, чтобы ускорить время запуска нашего приложения
  2. Как мы можем лучше всего обрабатывать все потоки, учитывая, что работа каждого потока независима друг от друга, нам просто нужно дождаться завершения всех потоков, прежде чем продолжить.

Я с нетерпением жду некоторых ответов

Ответы [ 12 ]

0 голосов
/ 15 ноября 2010

более простой метод, который мне нравится использовать:

    private int ThreadsCount = 100; //initialize threads count
    private void button1_Click(object sender, EventArgs e)
    {   
        for (int i = 0; i < ThreadsCount; i++)
        {
            Thread t = new Thread(new ThreadStart(myMethod));
            t.IsBackground = true;
            t.Start(); 
        } 
    }

    private void myMethod()
    {
        //everytime a thread finishes executing decrease the threads count
        ThreadsCount = ThreadsCount - 1;

        if (ThreadsCount < 1)
        {
            //if all threads finished executing do whatever you wanna do here..
            MessageBox.Show("Finished Executing all threads!!!");
        }
    }
0 голосов
/ 06 апреля 2010

Если вы используете .NET 3.5 или ниже, вы можете использовать массив AsyncResult или BackgroundWorker и подсчитать, сколько потоков было возвращено (просто не забудьте уменьшить счетчик с помощью взаимосвязанных операций) (см. http://www.albahari.com/threading/ в качестве ссылки).

Если вы используете .NET 4.0, параллель для - это самый простой подход.

...