我有一个端口列表,我按顺序浏览以连接到数据库。通常,有一个默认端口可以工作,但有些连接使用非标准端口(我没有任何可见性)。其中大约有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。 (我只对获得SUCCESSFUL状态感兴趣)。
我的想法是,如果成功获得与1端口的连接,它将首先用信息(服务器,数据库,哪个端口和连接)挽救。
我是否正确地执行此操作(尤其是退出Parallel.For循环)?
答案 0 :(得分:3)
对于并行解决方案,ref dbConnection
看起来非常显眼。
您可能不需要ref
,并且通常不能在线程之间共享数据库连接。