2012-06-18 13 views
0

Webclient downloadfileasync를 통해 380 개 사이트에서 데이터를 샘플링하는 C# 응용 프로그램을 상속 받았습니다. 각 사이트마다 별도의 스레드가 생성됩니다! (다운로드마다 다음 데이터를 다운로드하기 전에 타임 아웃 기간이 있기 때문에로드가 일정하지는 않지만 여전히 그렇습니다!) 어쨌든 다음 해 정도 사이트 수가 증가 할 것이므로 이를 사이트의 하위 집합에 대해 Webclient downloadfileasync 호출을 많이하는 작업자 스레드 몇 개 (적당한 수)로 변경합니다. 그러나 여러 다운로드가 동시에 완료되면 어떻게 될지 잘 모르겠습니다. downloadfilecompleted 이벤트 핸들러가 webclient에 의해 직렬화됩니까? 또는 여러 웹 클라이언트 완료가 "동시에"(또는 더 많은 경우 인터리브 됨) 발생할 수 있습니까? 한 완료가 다른 것을 완수 할 위험이 있습니까? 아니면 누군가가 현재 구현에서 스레드의 폭발을 관리하는 방법에 대한 더 나은 제안을 가지고 있습니까?C# webclient async

미리 감사드립니다.

+0

어떤 프레임 워크 버전을 사용하고 있습니까? – CodingGorilla

+0

DownloadFileAsync를 사용하고 있다면 이미 자체 스레드에 있습니다. 그래서 또 다른 스레드의 사용은 일종의 무의미하고별로 효과적이지 않습니다. –

+0

Jon Skeet이 말했듯이 비동기 작업의 특징은 스레드 차단을 방지합니다. 아마도 [이 카운터] (http://technet.microsoft.com/en-us/library/cc768048.aspx) 중 일부를 사용하여 성능 모니터에서 응용 프로그램의 기본 프로필을 수행하여 추가 사이트를 비교할 수 있습니다 귀하의 응용 프로그램 프로세스가 수행 할 것입니다. 또한 최적화를 수행해야하는 경우 시작할 수있는 좋은 기회를 제공합니다. –

답변

2

나는 가능성이 동시에 제기에 여러 완료 이벤트를 기대 -하지만 하지 않는 한 당신은 신중하게 처리하지 않는 일부 공유 상태를, 그것을 잘해야합니다. 결과가 "손상"해서는 안됩니다. 그렇게되면 .NET의 버그입니다.

비동기 호출을 사용하는 경우에는 작업자 스레드가 필요하지 않음에 유의하십시오. 비동기 작업을 수행하는 전체 지점은 호출을 발행 한 다음 스레드를 차단하지 않으므로이됩니다. UI 스레드 (또는 무엇이든)에서 그렇게 할 수 있습니다.

최첨단 기술을 사용할 수있는 경우 C# 5/.NET 4.5 (출시 후보 모드)의 비동기/대기 기능을 사용하면 훨씬 쉽게 작업 할 수 있습니다.

+0

4 명의 응답자 모두에게 감사드립니다. 트레드를 작업하는 것을 고려해야 할 유일한 이유는 부하가 커지면 여러 CPU를 "활용"할 수 있어야했기 때문입니다. 그리고 "완료"루틴이 비동기 스레드, 즉 "내"스레드에서 실행되는지 확실하지 않았습니다. (비동기 스레드가 스레드를 얻으면 잠금이 필요할 수 있습니다.) –

+0

기본적으로 'WebClient'는 그것을 시작하는 동기화 컨텍스트와 함께 다시 랑데뷰 - 그러나 당신이 응답으로 * 많은 일을하지 않는 한, 나는 그것이 문제가 될 것이라고 기대하지 않을 것이다. –