2009-09-18 31 views
3

我在擺弄Silverlight的TCP通信,我不得不使用System.Net.Sockets.Socket類,它在Silverlight運行時只有異步方法。Socket.SendAsync線程是否安全有效?

我想知道如果兩個線程在很短的時間內從另一個線程調用Socket實例上的SendAsync會發生什麼?

我唯一的擔心是沒有混合字節通過TCP通道。

作爲一個異步方法我想消息被放置在一個隊列中,單個線程從中出隊,所以不會發生這種情況(消息在線路上的混合內容)。

但我不確定,MSDN也沒有說明方法描述中的任何內容。有沒有人肯定這個?

EDIT1:沒有,調用SendAsync如之前鎖定的對象上:

lock(this._syncObj) 
{ 
    this._socket.SendAsync(arguments); 
} 

不會幫助,因爲這串行發送數據沒有實際發送的數據的請求。

回答

6

要撥打SendAsync,您需要先撥打電話ConnectAsync,並帶上SocketAsyncEventArgs的實例。它是代表客戶端和服務器之間連接的SocketAsyncEventArgs的實例。調用SendAsyncSocketAsyncEventArgs相同的實例剛剛用於未完成調用SendAsync將導致異常。

可以對同一個Socket對象的SendAsync進行多次未決呼叫,但只能使用SocketAsyncEventArgs的不同實例。例如(在一個平行的宇宙中,這可能是必需的),你可以同時在同一個服務器上創建多個HTTP帖子,但是在不同的連接上。這是完全可以接受的,通常客戶端和服務器都不會對哪個數據包是哪個數據包感到困惑。