我有我的Sender
類兩種方法:在兩個併發的NetworkStream.BeginWrite調用中會發生什麼?
public void SendMessage(OutgoingMessage msg)
{
try
{
stream.BeginWrite(msg.TcpData, 0, 16, messageSentCallback, msg);
}
catch
{
// ...
}
}
private void messageSentCallback(IAsyncResult result)
{
stream.EndWrite(result);
if (result.IsCompleted)
onDataSent(result.AsyncState as OutgoingMessage);
}
程序可以調用(如果他們有到發件人的訪問)SendMessage()
方法的其他部分。由於該程序在多線程環境中工作,多線程可以訪問發件人對象。
我有2個問題:
Q1)將使得向SendMessage
方法兩個同時呼叫能夠弄亂TCP通信(通過填充具有混合數據的TCP傳出緩衝液)?
Q2)將封閉的stream.BeginWrite()
調用打入lock { }
解決這個問題?
據我所知,調用BeginWrite只是將數據存儲到TCP輸出緩衝區中。是對的嗎?
這不會出錯,第二次調用引發異常。鎖定BeginWrite調用沒有修復,只需要幾微秒。您需要修復代碼中的邏輯錯誤。 – 2012-02-20 15:39:54
您是否認爲所需的場景是在調用stream.EndWrite之前不允許另一個BeginWrite?這會起作用嗎?是的,鎖會阻止其他線程調用BeginWrite,但這並不意味着套接字(或其緩衝區)處於可以再次寫入的狀態(直到調用EndWrite)。那是對的嗎? – 2012-02-21 06:23:46