簡體   English   中英

C#非阻塞套接字沒有while(true)循環

[英]C# non-blocking socket without while(true) loop

我只是想在c#中使用非阻塞套接字進行一些套接字編程。 我發現的各種樣本,比如這樣 ,似乎使用了一個while(true)循環,但是這種方法會導致cpu突然達到100%。 有沒有辦法使用事件編程風格的非阻塞套接字? 謝謝

請參閱此處的MSDN示例。 該示例顯示了如何異步接收數據。 您還可以使用Socket BeginSend / EndSend方法異步發送數據。

您應該注意,回調委托在ThreadPool線程的上下文中執行。 如果回調內部接收的數據需要與另一個線程共享,這很重要,例如,以Windows窗體顯示數據的主UI線程。 如果是這樣,您將需要使用lock關鍵字同步對數據的訪問權限。

正如您所注意到的那樣,使用非阻塞套接字和while循環,處理器固定為100%。 異步模型僅在有數據要發送或接收時才調用回調委托。

為了避免在繁重的while循環中出現CPU問題,當沒有數據接收時放入thread.sleep(100)或更少。 這將讓其他流程改變以完成他們的任務

一般性地談論阻塞/非阻塞IO,一般適用:

關鍵是在現實生活中,你的程序做其他事情而不做IO。 這些例子都是以這種方式設計的。

在阻塞IO時,您的線程在等待IO時“阻塞”。 操作系統會執行其他操作,例如允許其他線程運行。 因此,您的應用程序可以通過使用許多線程並行地(概念上)執行許多操作。

在非阻塞IO中,您的線程會查詢IO是否可行,否則會執行其他操作。 因此,您可以通過顯式地 - 在應用程序級別 - 並行處理來並行執行許多操作。

Socket.BeginReceive和AsyncCallback

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM