2009-05-27 4 views
2

많은 웹 페이지/rss 피드를 동시에 모니터링하고 정기적 인 빈도로 폴링하고 싶습니다 (모든 업데이트 빈도가 다를 수 있음). 나는 무한 루프를 반복하고 가져온 데이터를 처리 한 후 다음 업데이트까지 잠자기하고 싶은 각 소스에 대한 스레드를 만드는 방법에 대해 생각하고 있습니다.많은 웹 페이지/rss 피드 모니터링

다른 사람이 더 좋은 아이디어를 갖고 있거나 그것을 수행하는 방법에 대한 예가 있습니까?

답변

0

타이머를 사용하여 각 1 분 (또는 5 분) 킥합니다. 타이머 콜백에서 확인해야 할 URL을 물어보고 확인 여부를 확인하십시오 (주석을 넣을 때마다 동기화 시간이 달라짐). URL과 시간 제한을 유지할 수있는 적절한 구조와 그 이후의 마지막 시간을 준비 할 수 있습니다.

URL이 동기화되면 OK입니다 (시간이 경과했습니다). 비동기 HttpWebRequest를 시작하여 가져옵니다. 그런 식으로 모든 수신 파트를 스레드 풀 스레드로 오프로드하므로 주 타이머 콜백 스레드에 영향을 미치지 않습니다.

응답에 많은 처리를하는 경우 HttpWebRequest 콜백에서 일반 스레드를 시작하여 추가 처리를 수행하거나 일종의 대기열을 구현하여 스레드 풀 스레드를 즉시 해제 할 수 있습니다. 가능한.

여기에 비동기 요청을하는 방법 좋은 설명입니다 http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic23172.aspx

당신은뿐만 아니라 더 많은 예제를 위해 구글 수 있지만, 이것은 좋은 시작이다.

+0

추가 정보는 나는 그들이 실제로 조용하고 좋은, 타이머에 생각 (지금까지 모든 해답에 의해 광고)하지만 소스는 항상 동일한 주파수 또는 동시에 업데이트 야해하지 않았다 . – Dave

+0

각 리소스마다 자체 제한 시간이 있다고 명시하지 않았습니다. 그러나 여전히 - 많은 타이머를 가질 수 있습니다 - 하나의 타이머에서 유사한 시간 제한을 사용하여 여러 리소스를 그룹화합니다. 또한 응답의 무거운 처리를 수행하려는 경우 비동기 요청의 콜백에서 처리하지 말고 결과를 처리하기 위해 스레드를 시작하여 트레드 풀 스레드가 곧 해제됩니다. –

+0

응답이 새로운 요구 사항을 반영하도록 변경되었습니다. 또한 질문을 수정하십시오. –

0

10 분 동안 모든 스레드를 무작위로 업데이트하는 대신 매 시간마다 (10, 20, 30 등) 10 개 모두를 업데이트하는 등의 이유로 한 번의 시계에서만 동기화하지 않는 이유는 무엇입니까? 페이지/피드 당 하나의 스레드를 만들어야하는 이유는 무엇입니까?

0

Background 개체를 백그라운드에서 처리 할 수 ​​있도록 Timer 개체를 사용하여 BackgroundWorkerThread 개체를 사용하여 프로세스를 시작합니다. 보유하고있는 피드의 수에 따라 짧은 간격으로 "시차"업데이트를 수행하는 것이 좋습니다. 5 분마다, 작업자 스레드가 시작되고, 모니터링 할 피드 목록의 다음 피드로 이동하여 업데이트를 확인합니다.

일부 피드 리더에서 보신 것처럼 모든 피드를 한꺼번에 업데이트하는 것이 항상 사용자 인터페이스를 정지시키는 경향이 있으므로 항상 좋은 해결책은 아닙니다.

0

당신이 설명하는 것을 달성하기 위해 창 서비스를 만들었습니다. n 분마다, 데몬은 깨어나서 가져와야하는 URL이있는 XML 파일을 읽고 모든 데이터를 처리 한 다음 n 분 동안 다시 절전 모드로 전환합니다. 데이터를 가져올 스레드와 XML 파일을 모니터링하는 스레드가있었습니다. XML 파일은 웹 인터페이스를 통해 업데이트 될 수 있습니다.

yx가 지적했듯이 페이지 당 하나의 스레드를 생성 할 필요는 없지만 fecth에 대한 많은 URL이있는 경우 URL을 100 패키지 (예 :)로 배포 한 다음 모든 패키지. 그런 다음 데몬을 다시 보내려면 마지막 스레드가 완료 될 때까지 기다려야합니다.

-1

각 소스에 대한 하나의 스레드는 시작하기에 과잉입니다. 둘째로 잠자는 스레드는 중요한 메모리를 낭비합니다. 스레드의 수> 코어의 수는 모든 데이터가 시간의 일부 또는 전부를 지원한다는 데이터가 없다면 정당화되지 않습니다.

스레드의 수를 결정할 때 더 많은 고려 사항이 필요합니다. 스레드의 목적을 확인하려고하지 않습니다. 향후 개발에서 누군가가 10 가지 더 많은 것을하고 싶어하며, 각 스레드마다 10 개의 스레드를 추가 할 것입니다. 이 방법을 사용하면 taskmanager에서 얼마나 많은 스레드가 너무 많은 스레드 (각 스레드 = 1MB의 메모리 + 추가 리소스 돼지)를 얼마나 많이 생성했는지 확인할 수 있습니다. 아마 1GB의 RAM이 생성 될 것이므로 많은 스레드가 만들어지고 실제로 아무런 도움이되지 않습니다. 그리고 대부분의 시간자는. 그렇기 때문에 Threadpool 또는 Async IO는 필요한 경우 시스템 스레드를 재사용 할 수있는 방법이며 여러 응용 프로그램에서 공유됩니다.

다음은 내 생각입니다. 하나의 스레드 또는 실행중인 타이머가 있고 필요하면 잠자기합니다. 비동기 호출 (하나의 호출을 차단하지 않음) 또는 Queue가 모든 스레드 풀에 대한 모든 호출을 대기시킵니다. 리프레쉬주기에 도달 한 리프레쉬 소스 (정말로 필요할 경우 적은 시간 동안 슬립 모드로 전환됨). Asynchronous IO & Threadpool

+0

downvote에 대한 이유가 있습니까? –