我有一个端口列表,为了连接到数据库,我会按顺序遍历这些端口。通常,有一个默认端口可以工作,但有些连接使用非标准端口(我没有任何可见性)。其中大约有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端口,它将在第一次机会释放出信息(服务器、数据库、哪个端口和连接)。
我做得对吗(特别是脱离并行循环)?

最佳答案

对于并行解决方案,ref dbConnection看起来非常明显。
您可能不需要ref,并且数据库连接通常不能在线程之间共享。

09-05 23:43