我有我的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