[.그물] VB.NET 프로세서 사용을 낭비하지 않고 TCP 연결을 수신합니다.
에 도달 할 때마다 Application.DoEvents
재검토를 시도해야합니다. 일반적으로 해결 방법입니다. 적어도 이번에는 당신이 나쁜 상황에 있다는 것을 이미 알고 있습니다. :)
모든 것을 동기식으로 수행하는 것이 만족 스럽다면 새 스레드를 시작한 다음이를 호출 TcpListener.AcceptTcpClient
합니다. (당신은 할 수 전화 TcpListener.AcceptSocket
당신이 정말로 소켓을 원하는 경우,하지만 TcpClient
일반적으로 갈 수있는 간단한 방법입니다.) 클라이언트 준비 어쨌든 때까지 당신이 체크 라운드 루프 필요가 없습니다 그 전화는 차단됩니다 Pending
속성을.
따라서 UI 이벤트를 수신 할 준비가 된 UI 스레드와 인바운드 요청을 기다리는 하나의 스레드가 있습니다.
이제 대신 비동기 API를 사용할 수 있습니다. 특히 Async 및 Await와 함께 VB11을 사용하는 경우 더욱 그렇습니다. 다음을 사용할 수 있습니다.
Dim client As TcpClient = Await listener.AcceptTcpClientAsync();
... UI 스레드에서. 이는 UI 스레드를 차단하지 않지만 들어오는 연결을 비동기 적으로 수락하기 시작 합니다. 연결되면 나머지 비동기 메서드가 계속됩니다. 추가 스레드가 필요하지 않습니다. 차단을 피하기 위해 비동기를 사용하여 UI 스레드에서 모든 작업을 잠재적으로 수행 할 수 있습니다 . 그러면 UI와 더 쉽게 상호 작용할 수 있지만 익숙해지는 데는 시간이 걸립니다.
비동기식과 네트워킹에 익숙하지 않다면 아마도 동기식 버전 부터 시작할 것입니다 . 그런 다음 나중에 모험심을 느낀다면 모든 것을 비동기식 접근 방식으로 전환 할 수 있습니다.
-------------------나는 이것이 꽤 오래되었다는 것을 알고 있지만 비슷한 것을 검색했을 때 이것이 첫 번째 결과 중 하나였습니다.
Public Class main
Private client As TcpClient
Private listener As TcpListener
Private WithEvents tcpBg As BackgroundWorker
Private Sub main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
tcpBg = New BackgroundWorker
'Requires a routine that cancels background worker.
tcpBg.WorkerSupportsCancellation = True
'ip is most likely from a Textbox.
Dim adr As Net.IPAddress = Net.IPAddress.Parse(ip)
listener = New TcpListener(adr, 60000)
tcpBg.RunWorkerAsync()
End Sub
Private Sub tcpBg_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles tcpBg.DoWork
listener.Start()
While tcpBg.CancellationPending = False
client = listener.AcceptTcpClient
'Do something with your client.
client.Close()
End While
End Sub
End Class
이것이 내가 TCPListener를 구현 한 방법입니다. FX-8350의 사용량은 약 0.1 %입니다. 내 Athlon II X2에서 어떤 느낌 이었는지 확실히 말할 수는 없지만 몇 퍼센트 이상일 수는 없었습니다. GUI가 멈추지 않으며 실제 CPU 사용량이 없어야합니다.
물론 실제 구현은 몇 가지 다른 클래스에 있습니다. 이것은 기초의 간단한 예입니다.
출처
https://stackoverflow.com/questions/22006872