IO 작업 (예 : 네트워크, 파일 시스템 등)을 할 때 비동기 작업 (예 : BeginXXX/EndXXX, XXXAsync/XXXCompleted, XXXAsync async/await)을 사용해야합니다. 이러한 작업은 널리 알려진 IO complition ports을 사용합니다. 두 단어로, 데이터가 전송되는 동안 CPU 리소스를 소비하지 않습니다. 요청 된 데이터가로드되면 바로 ThreadPool에서 스레드를 가져 와서 처리기를이 스레드에 대기시킵니다. 귀하의 경우에는 CPU 리소스를 낭비하고 있습니다. 유용한 작업을 수행하는 대신 스레드는 데이터가 전송 될 때까지 대기합니다. 또한 ThreadPool에는 스레드 수 (일반적으로 CPU 코어 수와 동일)가 있습니다. 그래서, 당신은 한 번에 2 개의 클라이언트로 /로부터 데이터를 보내고받습니다.
비동기 방법은 매우 복잡해 보이지만 (특히 BeginXXX/EndXXX), 사용법을 상당히 단순화하는 많은 래퍼가 있습니다. 예를 들어 Rx'sFromAsyncPattern 확장 메서드를 사용하거나 새로운 async/await 비동기 모델을 사용할 수 있습니다.
정확히 타이머를 어떻게 사용하고 있습니까? 나는 그것을 얻지 못한다. 이것에 대해 더 자세히 설명해 주시겠습니까? – darkey
* a * 타이머를 여러 번 사용하지 않는 경우, 몇 개가 아닌 하나의 스레드 풀 스레드 만 사용됩니다. 즉, begin/end 읽기 함수는이를 수행하기 위해 설계되었으며 비동기 작업을 수행하는 동안 스레드의 시간을 차지하지 않습니다. 따라서 두 가지 해결책 *을 제대로 수행 할 수 있고 오버 헤드를 최소화 할 수 있습니다. 물론 어느 솔루션이든 부적절하게 구현 될 수 있으며 수용 가능한 것보다 더 많은 리소스를 소비 할 수 있습니다. – Servy
@darkey'timer.elapsed' 이벤트가 발생 될 때마다 스크립트는 조건을 거의 확인하지 않고 조건이 통과하면'UdpClient.Send'와'UdpClient.Receive'를 사용하여 보내고받은 다음에'Timer.Elapsed '이벤트는 확인 된 조건에 따라 0 또는 1 이상의 임의의 수의 UDP 메시지를 가질 수 있습니다. – sharp12345