2012-12-20 3 views
3

다른 포트에서 패킷을 동시에 전송해야하므로 UdpClient 클래스의 인스턴스가 5000 개있는 응용 프로그램을 실행하고 있습니다.수천 개의 동시 패킷, ThreadPool 대 BeginRead?

나는 ThreadPool에서 실행되는 System.Timers.Timer을 현재 사용하고 있습니다. 많은 Elapsed 이벤트가 발생하는 매우 짧은 Interval이 있습니다.

BeginRead/EndReadUdpClient의 기능을 사용하려면 응용 프로그램을 수정하는 것이 더 좋습니까?

+0

정확히 타이머를 어떻게 사용하고 있습니까? 나는 그것을 얻지 못한다. 이것에 대해 더 자세히 설명해 주시겠습니까? – darkey

+0

* a * 타이머를 여러 번 사용하지 않는 경우, 몇 개가 아닌 하나의 스레드 풀 스레드 만 사용됩니다. 즉, begin/end 읽기 함수는이를 수행하기 위해 설계되었으며 비동기 작업을 수행하는 동안 스레드의 시간을 차지하지 않습니다. 따라서 두 가지 해결책 *을 제대로 수행 할 수 있고 오버 헤드를 최소화 할 수 있습니다. 물론 어느 솔루션이든 부적절하게 구현 될 수 있으며 수용 가능한 것보다 더 많은 리소스를 소비 할 수 있습니다. – Servy

+0

@darkey'timer.elapsed' 이벤트가 발생 될 때마다 스크립트는 조건을 거의 확인하지 않고 조건이 통과하면'UdpClient.Send'와'UdpClient.Receive'를 사용하여 보내고받은 다음에'Timer.Elapsed '이벤트는 확인 된 조건에 따라 0 또는 1 이상의 임의의 수의 UDP 메시지를 가질 수 있습니다. – sharp12345

답변

3

IO 작업 (예 : 네트워크, 파일 시스템 등)을 할 때 비동기 작업 (예 : BeginXXX/EndXXX, XXXAsync/XXXCompleted, XXXAsync async/await)을 사용해야합니다. 이러한 작업은 널리 알려진 IO complition ports을 사용합니다. 두 단어로, 데이터가 전송되는 동안 CPU 리소스를 소비하지 않습니다. 요청 된 데이터가로드되면 바로 ThreadPool에서 스레드를 가져 와서 처리기를이 스레드에 대기시킵니다. 귀하의 경우에는 CPU 리소스를 낭비하고 있습니다. 유용한 작업을 수행하는 대신 스레드는 데이터가 전송 될 때까지 대기합니다. 또한 ThreadPool에는 스레드 수 (일반적으로 CPU 코어 수와 동일)가 있습니다. 그래서, 당신은 한 번에 2 개의 클라이언트로 /로부터 데이터를 보내고받습니다.

비동기 방법은 매우 복잡해 보이지만 (특히 BeginXXX/EndXXX), 사용법을 상당히 단순화하는 많은 래퍼가 있습니다. 예를 들어 Rx'sFromAsyncPattern 확장 메서드를 사용하거나 새로운 async/await 비동기 모델을 사용할 수 있습니다.

+0

+1, 적절한 성능을 원한다면 적절한 방법은 비동기 모드에서 IO를 사용하여 데이터가있을 때까지 CPU가 사용되지 않도록하는 것입니다. – Wam

+0

합리적인, 지금 내 유일한 관심사는 비동기 (BeginXXX/EndXXX)를 사용하여 코드의 가독성이 떨어지는 것입니다, 그 순간에, 나는 하나의 함수를 가지며 서명은 다음과 같습니다 :'[] [] SendReceive (IPEndPoint ipe, byte [] senddata)'. – sharp12345

+0

내가 말했듯이, async/await 또는 Rx를 사용하십시오. 특히 async/await를 사용하면 가독성이 훨씬 향상됩니다. –

관련 문제