Код: Выделить всё
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);
}
}
Как я уже упоминал, необходимо запустить два экземпляра этой задачи. в параллели. Один экземпляр называется задачей «Запрос», а другой — задачей «Ответ». Я передаю логическое значение (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
Мобильная версия