如何正确实现Parallel.For以获取正确的状态?

4

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


它对你有效吗?你有遇到任何问题吗? - svick
我的问题与ConcurrentStack集合有关。如果没有它,算法仍然正确吗?我主要使用它是为了防止“连接器”变量上的值冲突。 - ehmBEE
1个回答

3

对于并行解决方案,ref dbConnection 看起来非常显眼。

你可能不需要 ref,通常数据库连接不能在线程之间共享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接