1

Parallel.ForEach를 사용하여 고유 한 시간 초과 스레드를 생성하려고 시도하는 Windows 서비스에서 작업하고 있습니다. 문제는 VS에서 몇 시간 동안 코드를 혼자 두거나 몇 시간 동안 서비스를 중지하고 백업을 시작하면 초기 시작 코드가 두 번 실행된다는 것입니다. 다음은 서비스의 OnStart가 호출하는 고정 보이드의 스 니펫입니다.코드가 실행되지 않은 경우에만 Parallel.ForEach가 시작시 두 번 실행됩니까?

Parallel.ForEach(urls, url => 
        { 
         PageGrabber pagegrab = new PageGrabber(url); 
         if (url.Type.ToLower() == "http") 
         { 
          pagegrab.Elapsed += (obj, e) => 
           { 
            pagegrab.CheckNormal(); 
           }; 
          pagegrab.CheckNormal(); 
         } 
         else 
         { 
          pagegrab.Elapsed += (obj, e) => 
          { 
           pagegrab.CheckXML(); 
          }; 
          pagegrab.CheckXML(); 
         } 
        } 
        ); 

이 코드는 스레드를 직접 사용하면 좋지만 정말이 코드를 조금 업데이트하고 싶습니다. 중복 실행은 즉시 발생합니다. PageGrabber 객체는 WebClient를 사용하여 단순히 HTML 또는 XML을 문자열로 다운로드하는 것만 큼 간단합니다. 꽤 지루합니다.

+0

게시 한 코드의 어느 부분이 "초기 시작 코드"입니까? 아니면 다른 곳입니까? – svick

+0

누락 된 부분은 URL이 들어있는 텍스트 파일을 읽고 "url"개체를 만드는 부분입니다. try catch 블록에 있습니다. URL을 가져 와서 URL 객체를 만들고 URL 형식 목록에 추가 한 다음 foreach 루프를 추가합니다. 그것은 정말 기본입니다. 약 6 시간 동안 아무 것도 건드리지 않으면 단지 디버그하기가 어렵습니다. – kpcrash

+0

중복 실행은 다중 (거의) 동시 스레드의 요청에 대한 응답으로 발생합니까? 또는 단일 요청에 대한 응답으로 통제 된 환경에서 발생합니까? 즉, 둘러싼 메소드가 2x 호출되지 않았습니까? 귀하의 문제를 일으키는 게시 된 코드에는 아무것도 표시되지 않습니다. –

답변

3

Elapsed 이벤트에 가입 하셨다는 것이 문제가 될 것이라고 생각합니다. pageGrabber.Elapsed +=... 해당 이벤트를 발생시킬 수 있습니다. 그래서 어떤 조건에서는 이벤트가 발생하면 메서드가 두 번 호출됩니다. 그렇지 않으면 한 번 호출됩니다.

Parallel.Foreach 대신 작업 배열을 사용하여 병렬 구현을 변경하여이 문제를 해결할 수 있다고 생각하지 않습니다. 문제가 자주 발생하지 않을 수 있으며 이는 병렬 프로그래밍에서 매우 나쁜 증상입니다. 자신의 전제 조건을 더 어렵게 만들어서 문제가 사라지지 않도록해야합니다! 당신은 완전히 그들을 제거해야합니다!

+0

나는 동의하지 않는다. 그래서 경과 된 이벤트를 설정하기위한 대안에 대한 제안은 없습니까? 이 시나리오에서는 개체의 System.Timers.Timer가 자체 Interval에서 작동해야합니다. – kpcrash

+0

@kpcrash PageGrabber 클래스 및 Elapsed 이벤트의 책임에 대해 알지 못합니다. – mehrandvd

0

그래서 mehrandvd는 올바른 길을 가고있었습니다. System.Timers.Timer를 사용하는 클래스의 인스턴스를 만들 때 Interval 속성이 올바르게 설정되지 않았기 때문에 Elapsed 이벤트가 즉시 발생했습니다. 따라서 :

pagegrab.Elapsed += (obj, e) => 
         { 
          pagegrab.CheckXML(); 
         }; 
         pagegrab.CheckXML(); 

아무것도 한 동안 일도 없었던 중복 실행 인한 때문에 간격이 메모리에 더 이상이었다 올바르게 설정되어 있지했다 클래스의 인스턴스입니다. 내 어리 석음은 모두 고쳐졌습니다. 모든 의견과 제안에 감사드립니다.

관련 문제