2013-07-10 3 views
0

그 중 하나만 유효한 데이터베이스 연결 목록이 있습니다. 응용 프로그램이 응용 프로그램에 연결하여 입력 userId를 기반으로 사용자 정보를 가져와야합니다.Parallel.ForEach 중지 또는 휴식 시간이 너무 오래 걸림

   private string GetDatabaseId(string userId) 
       { 
       string dbId = string.Empty; 
       Parallel.ForEach(dictionaryAllDatabases, (db, state) => 
        { 
         user = GetUserFromDatabase(db.Key, userId); 
         if (user != null) 
         { 
          //we found user in database.set the db.Id and exit the loop 
          //it takes only 500 milliseconds to hit this line 
          dbId = db.Key; 
          state.Stop(); 
          return; 
         } 

        } 
       ); 
       //after about 15 seconds, we reach here 
       ..... 
       } 

는 그것이 유효한 데이터베이스를 발견 미만 500 밀리 초를 소요하고 나는 루프를 종료() state.Stop를 호출합니다. 루프를 종료하는 데 약 15 초가 걸립니다.

내가 잘못 했나요? 나는 당신은 아마 실패 할 다른 작업의 연결을 기다리고 Parallel.For

+1

이전 요청이 완료 될 때까지 기다리는 동안 동일한 데이터베이스 인스턴스와 잠금을 재사용하고있을 가능성이 있습니까? – Prix

+0

아니요, 모든 데이터베이스가 다릅니다. 내 응용 프로그램이 그들 중 일부에 액세스하지 않기 때문에 나는 시간 초과 또는 액세스 오류가 발생하지 않도록 Parallel.For를 사용합니다. –

답변

2

를 사용하는 경우

P.S.I

덕분에 같은 결과를 얻었다.

시도해보십시오. setting the connection timeout 2 초.

Stop은 강제로 다른 작업을 중지시키지 않고 새로운 작업을 시작하지 못하도록 막아줍니다. Parallel.ForEach는 작업간에 작업을 분할하는 방법을 결정합니다.

더 좋은 옵션은 취소 토큰과 함께 Connection.OpenAsync을 사용하고 Task.WaitAny()을 사용하는 것입니다.

+0

Eli, 어쨌든 다른 일을 그만두고 있습니까? 연결 시간 제한을 줄이는 것이 좋지만 이것이 최선의 방법인지 확신 할 수 없습니다. –

+2

상태의 IsStopped 속성을 조기에 중지하도록 쿼리 할 수 ​​있지만 다른 작업이 차단되고있는 것이 문제입니다. connection.OpenAsync를 취소 토큰으로 사용하고 Parallel.ForEach 대신 Task.WaitAny를 사용합니다. –

+0

감사합니다. 이제 Task.WaitAny를 사용하고 있습니다. 정상적으로 작동합니다. –

관련 문제