У меня есть список портов, через которые я последовательно прохожу для подключения к базе данных. Обычно есть порт по умолчанию, который работает, но есть подключения, которые используют нестандартный порт (который я не вижу). Их около 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)?