Witam,
chcę napisać komunikację z inną aplikacją wykorzystując protokół UDP.
Ten kod działa jeśli metoda Main wygląda tak:
static async Task Main(string[] args)
{
Program p = new Program();
await p.Run();
}
Używam wireshark do monitorowania komunikacji, wysyłam pakiet a aplikacja zewnętrzna odsyła odpowiedź, wszystko wygląda ok.
Problem zaczyna się kiedy chcę przesłać dwie ramki jedna za drugą:
{
Program p = new Program();
await p.Run();
await p.Run();
}
Wtedy zostaje wysłana tylko pierwsza (odpowiedź przychodzi prawidłowa).
Jeszcze ciekawiej robi się kiedy ta klasa jest biblioteką i kod:
{
Program p = new Program();
await p.Run();
}
podpinam pod button w formatce, po kilku wywołaniach wyglądających na poprawne, wireshark przestaje pokazywać wysyłane ramki.
Wtedy nawet wylogowanie z win11 nie pomaga, muszę restartować system.
Coś chyba jest namieszane w wątkach/taskach
proszę o jakieś sugestie jak to rozwiązać.
Kod klasy:
namespace AsyncAwait
{
class Program
{
private UdpConnect _udpConnect;
public Program()
{
_udpConnect = setParam(RemoteAddress, LocalPort, RemotePort);
}
private void Print(string txt)
{
string dateStr = DateTime.Now.ToString("HH:mm:ss.fff");
Console.WriteLine($"{dateStr} Thread #{Thread.CurrentThread.ManagedThreadId}\t{txt}");
}
private async Task Run()
{
Print("Program Start");
await SendUDP(); //.Wait();
await ReceiveUDP();
Print("Program End. Press any key to quit");
Console.Read();
}
private async Task SendUDP()
{
_udpConnect.Connect();
Print("SendUDP");
_udpConnect.Send(BitConverter.GetBytes(199));
Print("SendUDP End");
}
private async Task ReceiveUDP()
{
_udpConnect.Read();
Print("ReceiveUDP");
_udpConnect.Disconnect();
Print("ReceiveUDP End");
}
static async Task Main(string[] args)
{
Program p = new Program();
await p.Run();
await p.Run();
}
}
}
Pozdrawiam.