В настоящее время я разрабатываю проект клиента/сервера async tcp. Несколько клиентов будут подключаться к серверу (~ 100), и я отправляю объекты размером до 0,7 МБ. Я хотел бы отправить данные (двоичный формат сериализации) параллельно всем клиентам. Поэтому я написал следующий код:Async TCP Server/Client Approach
TCP Server:
private Task _pending = Task.FromResult<bool>(true);
/// <summary>
/// Objekt senden
/// </summary>
public async void Send(object data)
{
var previousTask = _pending;
_pending = Task.Run(async() =>
{
await previousTask;
MemoryStream ms = new MemoryStream();
_serializer.Serialize(ms, data, Settings.Serialisation);
if (Settings.UseCompression)
ms = new MemoryStream(_compression.Compress(ms));
if (Settings.Stream.AppendSignature)
new MemoryStream(Settings.Stream.Signature).CopyTo(ms);
Send(ms.ToArray());
ms.Dispose();
});
await _pending;
}
public void Send(byte[] data)
{
try
{
lock (_lock)
{
_clients.ForEach(c => c.Send(data));
}
}catch(System.Exception ex)
{
ExceptionHandler.HandleException(ex, "Error while sending data", this);
}
}
и вот мой обработчик клиент посылает метод
public void Send(byte[] data)
{
if (State != ConnectionState.Connected)
return;
try
{
_tcpsocket.SendAsync(CreateSendEventArgs(data));
}
catch (System.Exception ex)
{
ExceptionHandler.HandleException(ex, "Error on Send", this, LogLevel.Debug);
Disconnect();
}
}
по какой-то причине метод отправки не очень параллельно, то клиенты получая данные в случайное время. Я предполагаю, что я делаю что-то не так с этим асинхронным/ждущим материалом.
KR Manuel
Вам необходимо отправить все подключенные клиенты к тем же данным, или вы можете работать с каждым клиентом индивидуально? – Evk
Обычно я отправляю одни и те же данные всем клиентам, но иногда мне нужно отправлять данные конкретным клиентам –