消息之前要通過對我的一個應用程序,我用一段簡單的代碼,一個TCP連接發送數據:緩衝區被覆蓋,可以讀取
public void Send(byte[] message)
{
if (socket != null)
{
if (stream != null)
{
stream.Write(message, 0, message.Length);
if (receiveThread == null)
{
StartReceiver();
}
}
}
}
插座是TcpClient
類的一個實例,並且該流是關聯的流實例。 StartReceiver()
啓動一個線程,正如該方法所暗示的那樣,它接收發送給應用程序的數據。
要接收的數據,我使用:
private void ReceiveLoop()
{
DataReceivedStruct drs;
try
{
for (; ;)
{
if (stream != null)
{
drs = new DataReceivedStruct();
drs.stream = stream;
drs.waitHandle = are;
stream.BeginRead(readBuffer, 0, readBuffer.Length, DataReceived, drs);
Console.WriteLine("Waiting to be allowed to continue");
are.WaitOne();
Console.WriteLine("Allowed, continuing loop");
}
else
{
Thread.Sleep(5);
}
}
}
catch (SocketException e)
{
DispatchRaiseException(e);
}
catch (Exception e)
{
DispatchRaiseException(e);
}
}
再次,所用的流是TcpClient
類對象的上述流實例。 readBuffer對象是byte[1024]
。給BeginRead
回調看起來是這樣的:
private void DataReceived(IAsyncResult result)
{
DataReceivedStruct drs = (DataReceivedStruct)result.AsyncState;
NetworkStream used = drs.stream;
AutoResetEvent handle = drs.waitHandle;
used.EndRead(result);
DispatchRaiseReceived(readBuffer);
Console.WriteLine("Signalling allowance of continue for loop");
handle.Set();
}
它結束的流讀取動作和傳中readBuffer數據集。
這在原則上起作用。我可以發送和接收來自應用程序的數據。應用程序的接收端只有一個問題。嚮應用程序發送消息時,調用BeginRead
函數,之後回調觸發並結束與EndRead
的讀取操作,並傳遞數據以供進一步處理。這適用於一次一條消息。但在第一條消息觸發BeginRead
後直接發送另一條消息時,它會變得更有趣。接下來會發生的第一條消息的EndRead
還沒有發生,所以第一條消息的數據被第二條消息覆蓋,導致數據不正確。
我應該停止使用BeginRead
/EndRead
,只是使用阻止Read
操作來接收數據?還是有可能鎖定流與BeginRead
/EndRead
,所以第二個消息不會收到,直到第一個消息處理?
而不是使用共享緩衝區('readBuffer'),在'DataReceivedStruct'中聲明它 – 2012-02-17 10:34:20
無關緊要,因爲流仍會覆蓋第二條消息。 – ThaMe90 2012-02-17 10:40:02
不,既然你把它傳遞給'BeginRead' – 2012-02-17 10:47:41