많은 웹 페이지/rss 피드를 동시에 모니터링하고 정기적 인 빈도로 폴링하고 싶습니다 (모든 업데이트 빈도가 다를 수 있음). 나는 무한 루프를 반복하고 가져온 데이터를 처리 한 후 다음 업데이트까지 잠자기하고 싶은 각 소스에 대한 스레드를 만드는 방법에 대해 생각하고 있습니다.많은 웹 페이지/rss 피드 모니터링
다른 사람이 더 좋은 아이디어를 갖고 있거나 그것을 수행하는 방법에 대한 예가 있습니까?
많은 웹 페이지/rss 피드를 동시에 모니터링하고 정기적 인 빈도로 폴링하고 싶습니다 (모든 업데이트 빈도가 다를 수 있음). 나는 무한 루프를 반복하고 가져온 데이터를 처리 한 후 다음 업데이트까지 잠자기하고 싶은 각 소스에 대한 스레드를 만드는 방법에 대해 생각하고 있습니다.많은 웹 페이지/rss 피드 모니터링
다른 사람이 더 좋은 아이디어를 갖고 있거나 그것을 수행하는 방법에 대한 예가 있습니까?
타이머를 사용하여 각 1 분 (또는 5 분) 킥합니다. 타이머 콜백에서 확인해야 할 URL을 물어보고 확인 여부를 확인하십시오 (주석을 넣을 때마다 동기화 시간이 달라짐). URL과 시간 제한을 유지할 수있는 적절한 구조와 그 이후의 마지막 시간을 준비 할 수 있습니다.
URL이 동기화되면 OK입니다 (시간이 경과했습니다). 비동기 HttpWebRequest를 시작하여 가져옵니다. 그런 식으로 모든 수신 파트를 스레드 풀 스레드로 오프로드하므로 주 타이머 콜백 스레드에 영향을 미치지 않습니다.
응답에 많은 처리를하는 경우 HttpWebRequest 콜백에서 일반 스레드를 시작하여 추가 처리를 수행하거나 일종의 대기열을 구현하여 스레드 풀 스레드를 즉시 해제 할 수 있습니다. 가능한.
여기에 비동기 요청을하는 방법 좋은 설명입니다 http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic23172.aspx
당신은뿐만 아니라 더 많은 예제를 위해 구글 수 있지만, 이것은 좋은 시작이다.
10 분 동안 모든 스레드를 무작위로 업데이트하는 대신 매 시간마다 (10, 20, 30 등) 10 개 모두를 업데이트하는 등의 이유로 한 번의 시계에서만 동기화하지 않는 이유는 무엇입니까? 페이지/피드 당 하나의 스레드를 만들어야하는 이유는 무엇입니까?
Background 개체를 백그라운드에서 처리 할 수 있도록 Timer 개체를 사용하여 BackgroundWorkerThread 개체를 사용하여 프로세스를 시작합니다. 보유하고있는 피드의 수에 따라 짧은 간격으로 "시차"업데이트를 수행하는 것이 좋습니다. 5 분마다, 작업자 스레드가 시작되고, 모니터링 할 피드 목록의 다음 피드로 이동하여 업데이트를 확인합니다.
일부 피드 리더에서 보신 것처럼 모든 피드를 한꺼번에 업데이트하는 것이 항상 사용자 인터페이스를 정지시키는 경향이 있으므로 항상 좋은 해결책은 아닙니다.
당신이 설명하는 것을 달성하기 위해 창 서비스를 만들었습니다. n 분마다, 데몬은 깨어나서 가져와야하는 URL이있는 XML 파일을 읽고 모든 데이터를 처리 한 다음 n 분 동안 다시 절전 모드로 전환합니다. 데이터를 가져올 스레드와 XML 파일을 모니터링하는 스레드가있었습니다. XML 파일은 웹 인터페이스를 통해 업데이트 될 수 있습니다.
yx가 지적했듯이 페이지 당 하나의 스레드를 생성 할 필요는 없지만 fecth에 대한 많은 URL이있는 경우 URL을 100 패키지 (예 :)로 배포 한 다음 모든 패키지. 그런 다음 데몬을 다시 보내려면 마지막 스레드가 완료 될 때까지 기다려야합니다.
각 소스에 대한 하나의 스레드는 시작하기에 과잉입니다. 둘째로 잠자는 스레드는 중요한 메모리를 낭비합니다. 스레드의 수> 코어의 수는 모든 데이터가 시간의 일부 또는 전부를 지원한다는 데이터가 없다면 정당화되지 않습니다.
스레드의 수를 결정할 때 더 많은 고려 사항이 필요합니다. 스레드의 목적을 확인하려고하지 않습니다. 향후 개발에서 누군가가 10 가지 더 많은 것을하고 싶어하며, 각 스레드마다 10 개의 스레드를 추가 할 것입니다. 이 방법을 사용하면 taskmanager에서 얼마나 많은 스레드가 너무 많은 스레드 (각 스레드 = 1MB의 메모리 + 추가 리소스 돼지)를 얼마나 많이 생성했는지 확인할 수 있습니다. 아마 1GB의 RAM이 생성 될 것이므로 많은 스레드가 만들어지고 실제로 아무런 도움이되지 않습니다. 그리고 대부분의 시간자는. 그렇기 때문에 Threadpool 또는 Async IO는 필요한 경우 시스템 스레드를 재사용 할 수있는 방법이며 여러 응용 프로그램에서 공유됩니다.
다음은 내 생각입니다. 하나의 스레드 또는 실행중인 타이머가 있고 필요하면 잠자기합니다. 비동기 호출 (하나의 호출을 차단하지 않음) 또는 Queue가 모든 스레드 풀에 대한 모든 호출을 대기시킵니다. 리프레쉬주기에 도달 한 리프레쉬 소스 (정말로 필요할 경우 적은 시간 동안 슬립 모드로 전환됨). Asynchronous IO & Threadpool
downvote에 대한 이유가 있습니까? –
에
추가 정보는 나는 그들이 실제로 조용하고 좋은, 타이머에 생각 (지금까지 모든 해답에 의해 광고)하지만 소스는 항상 동일한 주파수 또는 동시에 업데이트 야해하지 않았다 . – Dave
각 리소스마다 자체 제한 시간이 있다고 명시하지 않았습니다. 그러나 여전히 - 많은 타이머를 가질 수 있습니다 - 하나의 타이머에서 유사한 시간 제한을 사용하여 여러 리소스를 그룹화합니다. 또한 응답의 무거운 처리를 수행하려는 경우 비동기 요청의 콜백에서 처리하지 말고 결과를 처리하기 위해 스레드를 시작하여 트레드 풀 스레드가 곧 해제됩니다. –
응답이 새로운 요구 사항을 반영하도록 변경되었습니다. 또한 질문을 수정하십시오. –