Ошибка WebSocket WriteAsync: «Этот метод нельзя вызвать, если ожидается другая операция записи».C#

Место общения программистов C#
Ответить
Гость
 Ошибка WebSocket WriteAsync: «Этот метод нельзя вызвать, если ожидается другая операция записи».

Сообщение Гость »


I am working on a console application using C# and .NET Core, where I have implemented a WebSocket. However, I am encountering an error when sending data to clients connected to the WebSocket. The error message is as follows:
"This method may not be called when another write operation is pending."
This error seems to occur more frequently as the number of clients and data flow increases. The relevant line of code causing the error is:

Код: Выделить всё

await stream
.WriteAsync(buffers, 0, buffers.Length, this.CancelToken.Token)
.ConfigureAwait(false);
I am looking for guidance on how to resolve this issue and prevent data loss. If you have any suggestions or solutions, please share them. Additionally, it's worth noting that using a queue structure in my system is not suitable because a new data point may override an existing one in the queue during the data flow.
All code:

Код: Выделить всё

private async Task NetStreamSendAsync(byte[] buffers, OpCode opCode = OpCode.Text)
{
try
{
if (!this.Active) return await Task.FromResult(-2).ConfigureAwait(false);
if (!this.Connected)
{
this.OnClientError?.Invoke(this, this.EndPoint, new SocketException((int)SocketError.NotConnected));
return -1;
}
if ((opCode == OpCode.Text || opCode == OpCode.Binary) && (buffers == null || buffers.Length == 0)) return 0;
var stream = this.GetSslStream();
if (stream == null) return -1;
if (this.ConnectionType == ConnectionType.WebSocket)
{
using (var packet = new WebSocketPacket(this))
buffers = packet.Packet(buffers, opCode);
}
else
if (buffers == null || buffers.Length == 0)
return await Task.FromResult(0).ConfigureAwait(false);
try
{

await stream.WriteAsync(buffers, 0, buffers.Length, this.CancelToken.Token).ConfigureAwait(false);
await stream.FlushAsync(this.CancelToken.Token);

this.LastMessageTime = DateTime.Now;
}
catch (Exception e)
{
LogHelper.Debug($"{SkipData++} - Error: {e.Message} - Veri: {Encoding.GetString(buffers)}");
this.OnClientError?.Invoke(this, this.EndPoint, new SocketException((int)SocketError.SocketError));
}
return await Task.FromResult(buffers.Length).ConfigureAwait(false);
}
catch (Exception e)
{
LogHelper.Debug($"[NetStreamSendAsync] Error: {e}");
Console.WriteLine($"[NetStreamSendAsync] Error: {e}");
throw;
}

}


Источник: https://stackoverflow.com/questions/781 ... r-write-op
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»