2011-10-31 2 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(); 
     } 
    } 
); 

헬퍼 클래스 ConnectInfo,

아래 정의된다

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

및 ConnectionState만을 들고 열거되고 : 실패하거나 SUCCESSFUL. (나는 단지 성공 상태를 얻는 것에 관심이있다).

내 생각에 1 포트에 연결하는 데 성공하면 첫 번째 기회에 정보 (서버, 데이터베이스, 포트 및 연결)를 사용하지 못하게됩니다.

이 작업을 올바르게 수행하고 있습니까 (특히 Parallel.For 루프를 벗어나는 경우)?

+0

나에게 맞는 것 같습니다. –

+0

효과가 있습니까? 어떤 문제가 있습니까? – svick

+0

내 문제는 ConcurrentStack 컬렉션입니다. 알고리즘이 없어도 여전히 알고리즘이 올바를 것입니까? 나는 주로 '커넥터'변수에 값 충돌이있을 가능성이있을 때이를 사용합니다. – ehmBEE

답변

3

병렬 솔루션의 경우 ref dbConnection이 매우 눈에 looks니다.

일반적으로 ref이 필요하지 않으며 데이터베이스 연결은 일반적으로 스레드간에 공유 될 수 없습니다.

관련 문제