C# SendAysnc 超时

 

业务方法

复制代码
@@@code

public 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 = 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;

}

}

 

}

 

 

@@#

复制代码

对上述方法调用,可以使用三种方式

异步,业务方法正常执行,超时处理正常,推荐使用此方法

@@@code

var result = await new Q.Sockets.UDPHelper2() { LocalIPEndPoint = localIP, ReceiveTimeout = 1000 }.SendAsync(ip, data, 1000);

@@#

 

同步,超时未生效,一直处于等待状态,除非方法内使用udpClient.SendAsync(data, data.Length, server).Wait(SendTimeout); //同步方法

@@@code

new Q.Sockets.UDPHelper2() { LocalIPEndPoint = localIP, ReceiveTimeout=1000 }.SendAsync(ip, data, 1000).Result

@@#

 

 

等待指定时间,强行在外部指定超时,打断了业务方法的执行时间(如接收大量数据)

复制代码
@@@code

var x = new Q.Sockets.UDPHelper2() { LocalIPEndPoint = localIP, ReceiveTimeout = 1000 }.SendAsync(ip, data, 1000);

x.Wait(3000);

if (x.IsCompleted)

{

show(x.Result);

}

 

@@#

复制代码

 

posted @   秦秋随  阅读(1119)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示