2011-10-31 92 views
4

我有一個端口列表,爲了連接到數據庫,我順序地通過端口。通常,有一個默認端口可以工作,但有些連接使用非標準端口(我沒有任何可見性)。其中大約有20-30人,並且順序經歷他們需要很長時間。如何實現Parallel.For正確地獲取正確的狀態?

下面,我讓我的第一個試圖並行連接到端口的順序算法。

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(); 
     } 
    } 
); 

helper類,ConnectInfo,被定義如下:

class ConnectInfo 
{ 
    ConnectInfo(serverName, databaseName, port) {} 
    State { get; set; } 
    DbConnection { get; set; } 
} 

和ConnectionState是一個枚舉只持有:失敗或成功的。 (我只對獲得成功的狀態感興趣)。

我的想法是,如果成功獲得與1端口的連接,它將首次獲得有關信息(服務器,數據庫,端口和連接)的信息。

我是否正確地做這件事(特別是離開Parallel.For循環)?

+0

對我來說似乎是正確的。 –

+0

它適合你嗎?你遇到任何問題嗎? – svick

+0

我的問題是與ConcurrentStack集合。沒有它,算法仍然是正確的嗎?我主要使用它來避免'連接器'變量發生值衝突。 – ehmBEE

回答

3

對於並行解決方案,ref dbConnection看起來非常顯眼。

您可能不需要ref並且數據庫連接通常不能在線程間共享。