Как правильно реализовать Parallel.For для получения правильного состояния? - PullRequest
4 голосов
/ 31 октября 2011

У меня есть список портов, через которые я последовательно прохожу для подключения к базе данных. Обычно есть порт по умолчанию, который работает, но есть подключения, которые используют нестандартный порт (который я не вижу). Их около 20-30, и их последовательное прохождение займет много времени.

Ниже я предпринял первую попытку распараллеливания последовательного алгоритма при подключении к портам.

nonStdPorts = {...}; // list of all non-standard ports (max: 30); 


ConnectionState state = ConnectionState.FAIL; 
ConcurrentStack<ConnectInfo> results = new ConCurrentStack<ConnetInfo>(); 

// Assume single instance. Add an outer for-loop if multiple instances are present. 
Parallel.For(0, nonStdPorts.Length, (i, loopState) =>
    {
        ConnectInfo connector = new ConnectInfo(serverName, databaseName, port); 
        connector.State = TryConnect(serverName, databaseName, nonStdPorts[i], ref   dbConnection);  
        results.Push(connector); 

        if (connector.State == ConnectionState.SUCCESSFUL) 
        {
            loopState.Stop(); 
        }
    }
); 

Вспомогательный класс ConnectInfo определен ниже:

class ConnectInfo 
{
   ConnectInfo(serverName, databaseName, port) {} 
   State { get; set; } 
   DbConnection { get; set; } 
}

и ConnectionState, содержащий только перечисление: FAIL или SUCCESSFUL. (Меня интересует только УСПЕШНОЕ состояние).

Я думаю, что если соединение с 1 портом окажется успешным, при первой же возможности оно вылетит с информацией (сервер, база данных, порт и соединение).

Правильно ли я делаю это (особенно при выходе из цикла Parallel.For)?

1 Ответ

3 голосов
/ 31 октября 2011

Для параллельного решения ref dbConnection выглядит очень заметным.

Возможно, вам не нужен ref, и соединение с базой данных обычно нельзя разделить между потоками.

...