2009-08-26 62 views
4

System.Net.Sockets.Socket.NET C#插座併發問題

的實例

可以通過2個線程,以便一個使用send()方法被共享和另一個是接收()方法?

安全嗎?

嗯,我需要它不僅是線程安全的,而且發送/接收方法是非同步的,以便讓每個線程同時調用它們。

我還有另一種方法嗎?

感謝您的幫助,我在java中經驗豐富,但很難做出這一點。

回答

6

它應該是安全的,是的。 Socket類由MSDN to be fully thread-safe引用。

但我不知道這是不是一個好主意。你可能會通過使用兩個線程讓自己很難。您可能想要查看異步版本BeginSendBeginReceive,在這種情況下,您不應該需要多個線程。

+1

首先,我關心的不僅是線程安全性,還包括併發使用讀/寫。嗯,好吧,讓我再問一些問題,請回答我。在引擎蓋下,那些異步方法的使用管理另一個線程來實現asincronicity rigth?如果是這樣,每次我打電話開始...,它會創建一個新的線程? – 2009-08-26 20:12:29

+1

據我所知,一個新的線程被創建,但它不會成爲每一次調用的新線程。我做了一個小測試來確認,它確實是這樣。 – Thorarin 2009-08-26 21:02:52

+0

任何參考請:D – 2009-08-26 21:20:04

2

是的,這是完全安全的訪問發送和接收來自兩個不同的線程在同一時間。

如果您希望您的應用程序擴展到100個活動套接字,那麼您需要使用BeginReceiveve/BeginSend方法而不是手動創建線程。這將在幕後做魔術,這樣你就不會產生100個線程來處理套接字。究竟是什麼依賴於平臺。在Windows上,您將使用'高性能'io完成端口。在Linux下(單聲道)你會使用epoll我相信。無論哪種方式,你最終將使用比活動套接字少很多的線程,這總是一件好事:)

+0

你爲什麼說使用專用的線程進行接收/發送將帶來更大的延遲或施加可擴展性問題比使用異步方法? – 2009-08-27 14:12:32

+1

假設你有500個開放式套接字,你只能接受它們。你需要啓動500個線程,每個線程都在Socket.Receive()上阻塞。 現在,假設您使用了該方法的異步BeginReceive版本。 .NET運行時會將套接字交給操作系統,並說「當他們有數據時告訴我」。當他們有數據時,運行時會從線程池中獲取線程並調用AsyncCallback,以便處理數據。 這是比上下文切換500個線程更多的表現。 – Alan 2009-08-30 11:38:33

2

很少有話題,但使用同步方法只有有限的客戶端時纔有用。我發現異步套接字響應速度較慢。異步套接字在處理許多客戶端方面要好得多。因此: 同步速度更快。 異步更具可擴展性