我有一个端口列表,按顺序连接到数据库。通常情况下,有一个默认端口可以使用,但是有些连接使用了非标准端口(我没有任何可见性)。大约有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循环中退出)?