Код: Выделить всё
_readResult
У меня есть TCP-клиент, который взаимодействует с моим сервером, и он работает нормально, все сообщения работают хорошо, но когда я отключите клиент, я получаю исключение System.StackOverflowException и получаю поток:
at System.Net.Sockets.NetworkStream.BeginRead(Byte [], Int32, Int32, System.AsyncCallback, System.Object)
в VisualShot.TargetServer.Models.Communication.TcpMessageReader.readCompleteCallback(System.IAsyncResult)
в System.Threading.Tasks.TaskToAsyncResult+TaskAsyncResult ..ctor(System.Threading.Tasks.Task, System.Object, System.AsyncCallback)
at System.Threading.Tasks.TaskToAsyncResult.Begin(System.Threading.Tasks.Task, System.AsyncCallback, System.Object )
в System.Net.Sockets.Socket.BeginReceive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.AsyncCallback, System.Object)
в System.Net.Sockets .NetworkStream.BeginRead(Byte[], Int32, Int32, System.AsyncCallback, System.Object)
в VisualShot.TargetServer.Models.Communication.TcpMessageReader.readCompleteCallback(System.IAsyncResult)
в System.Threading .Tasks.TaskToAsyncResult+TaskAsyncResult..ctor(System.Threading.Tasks.Task, System.Object, System.AsyncCallback)
at System.Threading.Tasks.TaskToAsyncResult.Begin(System.Threading.Tasks.Task, System .AsyncCallback, System.Object)
в System.Net.Sockets.Socket.BeginReceive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.AsyncCallback, System.Object)
в System.Net.Sockets.NetworkStream.BeginRead(Byte[], Int32, Int32, System.AsyncCallback, System.Object)
в VisualShot.TargetServer.Models.Communication.TcpMessageReader.readCompleteCallback(System.IAsyncResult)
at System.Threading.Tasks.TaskToAsyncResult+TaskAsyncResult..ctor(System.Threading.Tasks.Task, System.Object, System.AsyncCallback)
at System.Threading.Tasks.TaskToAsyncResult.Begin(System.Threading .Tasks.Task, System.AsyncCallback, System.Object)
в System.Net.Sockets.Socket.BeginReceive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.AsyncCallback, System. Object)
в System.Net.Sockets.NetworkStream.BeginRead(Byte[], Int32, Int32, System.AsyncCallback, System.Object)
в VisualShot.TargetServer.Models.Communication.TcpMessageReader.readCompleteCallback( System.IAsyncResult)
в System.Runtime.CompilerServices.TaskAwaiter+c.b__12_0(System.Action, System.Threading.Tasks.Task)
в System.Threading.ExecutionContext.RunInternal( System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
в System.Threading.Tasks.AwaitTaskContinuation.RunCallback(System.Threading.ContextCallback, System.Object, System.Threading.Tasks.Task ByRef)
в System.Threading.Tasks.Task.RunContinuations(System.Object)
в System.Threading.Tasks.Task
Код: Выделить всё
1[[System.Int32, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TrySetResult(Int32) at System.Threading.Tasks.ValueTask
at System.Net.Sockets.SocketAsyncEventArgs+c.b__173_0(UInt32, UInt32, System.Threading.NativeOverlapped*)
at System.Threading.ThreadPoolTypedWorkItemQueue`2[[System.Threading.PortableThreadPool +IOCompletionPoller+Event, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Threading.PortableThreadPool+IOCompletionPoller+Callback, System.Private.CoreLib, Version=8.0.0.0, Culture =нейтральный, PublicKeyToken=7cec85d7bea7798e]].System.Threading.IThreadPoolWorkItem.Execute()
в System.Threading.ThreadPoolWorkQueue.Dispatch()
в System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart()
Код C#
Код: Выделить всё
private bool _reading;
private Stream _stream;
private TcpClient _client;
private IAsyncResult _readResult;
private bool _disposed;
private byte[] _parseBuffer = new byte[0];
private byte[] _buffer = new byte[1024];
private int _maxBytesRead;
private void readCompleteCallback(IAsyncResult readAsyncResult)
{
if (_reading)
{
Stream stream = (Stream)readAsyncResult.AsyncState;
int bytesRead = stream.EndRead(readAsyncResult);
if (bytesRead > _maxBytesRead || bytesRead == _buffer.Length)
{
_maxBytesRead = bytesRead;
}
byte[] newParseBuffer = new byte[_parseBuffer.Length + bytesRead];
_parseBuffer.CopyTo(newParseBuffer, 0);
for (int i = 0; i < bytesRead; i++)
{
newParseBuffer[i + _parseBuffer.Length] = _buffer[i];
}
_parseBuffer = newParseBuffer;
// Parsing
int bytesConsumed = MessageFactory.GetNextMessages(
_parseBuffer, // buffer
0, // msgReadStart
_parseBuffer.Length, // totalBytesAvailableToConsume
out var messages);
newParseBuffer = new byte[_parseBuffer.Length - bytesConsumed];
for (int i = bytesConsumed; i < _parseBuffer.Length; i++)
{
newParseBuffer[i - bytesConsumed] = _parseBuffer[i];
}
_parseBuffer = newParseBuffer;
_readResult = stream.BeginRead(
_buffer,
0,
_buffer.Length,
new AsyncCallback(readCompleteCallback),
stream);
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... wexception