카테고리 없음

[.그물] VB.NET 프로세서 사용을 낭비하지 않고 TCP 연결을 수신합니다.

행복을전해요 2021. 1. 16. 03:56

에 도달 할 때마다 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