業務方法
@@@codepublic override async Task<List<(IPEndPoint endPoint, byte[] data)>> SendAsync(IPEndPoint server, byte[] data2, int getResponseCount = 1)
{
//隨機使用埠,支持并發
using (UdpClient udpClient = new UdpClient(LocalIPEndPoint)) //廣播包在有虛擬機的時候必須指定有效網卡
{ //多網卡容易丟包
udpClient.Client.SendTimeout = SendTimeout;
udpClient.Client.ReceiveTimeout = ReceiveTimeout;
byte[] data = https://www.cnblogs.com/QinQouShui/p/IsEncrypt ? Encrypt(data2) : data2;
try
{
int sendLength = await udpClient.SendAsync(data, data.Length, server);
//int sendLength = 0;
//udpClient.SendAsync(data, data.Length, server).Wait(SendTimeout); //同步方法
Log?.Invoke($"send:{server.ToString()},Len:{sendLength}/{data.Length},Data:{new Q.Mina.IoBuffer(data).getHexDump()}");
udpClient.Close();
return result;
}
catch (Exception ex)
{
return null;
}
}
}
@@#
對上述方法呼叫,可以使用三種方式
異步,業務方法正常執行,超時處理正常,推薦使用此方法
@@@codevar result = await new Q.Sockets.UDPHelper2() { LocalIPEndPoint = localIP, ReceiveTimeout = 1000 }.SendAsync(ip, data, 1000);
@@#
同步,超時未生效,一直處于等待狀態,除非方法內使用udpClient.SendAsync(data, data.Length, server).Wait(SendTimeout); //同步方法
@@@codenew Q.Sockets.UDPHelper2() { LocalIPEndPoint = localIP, ReceiveTimeout=1000 }.SendAsync(ip, data, 1000).Result
@@#
等待指定時間,強行在外部指定超時,打斷了業務方法的執行時間(如接收大量資料)
@@@codevar x = new Q.Sockets.UDPHelper2() { LocalIPEndPoint = localIP, ReceiveTimeout = 1000 }.SendAsync(ip, data, 1000);
x.Wait(3000);
if (x.IsCompleted)
{
show(x.Result);
}
@@#
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/117685.html
標籤:C#
上一篇:在Asp.Net Core MVC 3.0 視圖運行時編譯
下一篇:用C#搭建WebSocket
