(C#/.NET 8.0) Почему я не могу получать, а затем отправлять данные из UdpClients, созданных и используемых в отдельных пC#

Место общения программистов C#
Ответить
Anonymous
 (C#/.NET 8.0) Почему я не могу получать, а затем отправлять данные из UdpClients, созданных и используемых в отдельных п

Сообщение Anonymous »

Я работаю над консольным приложением, которому необходимо получать данные от двух локальных конечных точек и впоследствии отправлять эти данные на две удаленные конечные точки — параллельно. У меня есть код для получения/отправки данных в задаче, который выглядит следующим образом:

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

public async Task RecvAndSend(DataObj data, bool isRequest)
{
try
{
using var recv = new UdpClient(data.localPort);

using var send = new UdpClient();

var remoteEndpoint = new IPEndPoint(data.remoteAddress, data.remotePort);

while (true)
{
try
{
byte[] res = (await recv.ReceiveAsync()).Buffer;

await send.SendAsync(res, res.Length, remoteEndpoint);

Console.Write(isRequest ? "-" : "~");
}
catch (Exception ex) {
Console.WriteLine("Exception thrown in while loop: {0}", ex.Message);
}

}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Эта задача принимает 2 параметра. Первыми являются данные, относящиеся к локальному порту, на который эта задача будет получать данные, и удаленному адресу, на который она будет пересылать эти данные.
Как я уже упоминал, необходимо запустить два экземпляра этой задачи. в параллели. Один экземпляр называется задачей «Запрос», а другой — задачей «Ответ». Я передаю логическое значение (isRequest), которое можно использовать для записи символа в консоль для любой задачи, только что завершившей итерацию цикла while.
Я запускаю эти параллельные задачи вот так:

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

Task t1 = RecvAndSend(requestData, true);
Task t2 = RecvAndSend(responseData, false);

await Task.WhenAll(t1, t2);
Проблема в том, что первая задача начнет получать/отправлять данные, но как только вторая задача начнет получать/отправлять данные, первая задача останавливается. Итак, мой вывод выглядит примерно так:

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

-------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Я ожидаю увидеть следующее:

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

-~-~-~-~-~-~
Может быть, это не так синхронизировано, но вы поняли.
Я пробовал создавать отдельные экземпляры UdpClients для отправки и получения внутри каждую задачу, и я также попробовал объявить глобальные клиенты, предназначенные для получения/отправки, и использовать механизм блокировки внутри задачи.
Ничто не сработало должным образом. На данный момент я не уверен, возможно ли вообще иметь 2 потока с двумя UdpClient, каждый из которых получает и отправляет одновременно.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ated-and-u
Ответить

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

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

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

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

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