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

时间:2011-10-31 19:14:44

标签: c# .net algorithm .net-4.0 task-parallel-library

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

1 个答案:

答案 0 :(得分:3)

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

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