先上代码:
多线程实现ping校验:
public void PingCameraNew(List<CameraMongoDto> assetlist)
{
ThreadPool.SetMaxThreads(200, 200);
for (int a = 0, b = assetlist.Count; a < b; a++)
{
CameraMongoDto asset = assetlist[a];
bool poolkai = ThreadPool.QueueUserWorkItem(new WaitCallback(DoWorkNew), asset);
}
}
多线程执行的方法:
public void DoWorkNew(object asset)
{
try
{
CameraMongoDto cameraMongo = (CameraMongoDto)asset;
System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions();
options.DontFragment = true;
string data = "Test Data!";
byte[] buffer = Encoding.ASCII.GetBytes(data);
int timeout = 250; // Timeout 时间,单位:毫秒
int flag = 0;
for (int i = 0, j = 10; i < j; i++)
{
System.Net.NetworkInformation.PingReply reply = p.Send(cameraMongo.IP, timeout, buffer, options);
if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
{
flag = flag + 1;
}
}
cameraMongo.LosePacket = (10 - flag) * 10;
if (flag == 0)
{
cameraMongo.IsUsed = 1;
cameraMongo.AlarmLevel = (int)AlarmLevel.紧急;
}
else
{
cameraMongo.IsUsed = 0;
cameraMongo.AlarmLevel = (int)AlarmLevel.正常;
}
SingletonOff.Instance.Add(cameraMongo);
Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug(" --offnum:" + AlarmCount.Instance.offnum + "列表长度" + SingletonOff.Instance.Count);
if (SingletonOff.Instance.Count >= AlarmCount.Instance.offnum)
{
if (SingletonOff.Instance.Count > 0)
{
if (PingUpdata.Instance.Isused)
{
PingUpdata.Instance.Isused = false;
if (mongohelperc.CameraMongoUpList(SingletonOff.Instance))
{
AlarmHandingCameList(SingletonOff.Instance);
PingUpdata.Instance.Isused = true;
SingletonOff.Instance.Clear();
AlarmCount.Instance.offnum = 0;
}
}
}
}
}
catch (Exception ex)
{
Lind.DDD.Logger.LoggerFactory.Instance.Logger_Debug("线程执行失败!" + ex.Message + "trace:" + ex.StackTrace);
}
}
方法中没ping完一个设备,要把ping的结果存入单例的列表中,当单例的列表数大于等于需要ping的总数的时候,用一个方法把ping的结果存入数据库中,换句话说,是用列表的长度来衡量此次集体ping的所有线程是否完成。
ping的时候每一个设备循环ping十次的原因是需要保证ping的准确性,也可以把这十次ping的结果来做设备的丢包率。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器