我要实现一个先从数据库里读取所有电脑IP 取出来Ping,然后根据Ping结果来修改这张表的某一列,如何写。
------解决思路----------------------
这与是否多线程并没有关系
你只是:
1、查询数据库
2、循环查到的结果
2.1 对每一个结果执行 ping
2.2 根据返回的结果修改数据库
3、结束
这是单线程
多线程就是:在循环中开线程,执行 2.1、2.2
------解决思路----------------------
定义实体
属性如下: 表主ID,IP
提取表中所有IP数据(用上面的实体) 放到Queue队例(ipQueue)中
然后线程Thread定义两个或N个 线程调用的方法里 如下
void Proc()
{
while(ipQueue.Count>0)
{
lock(ipQueue)
{
实体= ipQueue.Dequeue();
结果= 这里Pin 实体.IP;
更新 表 set xxx=结果 where 表主ID=实体.主ID
}
}
}
------解决思路----------------------
你这个需求和多线程没神马关系
1、从数据库取出所有ip,塞到一个List<string>里面,比如lstAll
2、遍历lstAll,执行ping,然后修改数据库
当然,考虑提供效率,开启多个线程对List<string>里的元素进行ping
参考ThreadPool
------解决思路----------------------
多线程并发查询数据应该使用 PLInq 来写。
首先,需要将你的查询操作变为函数:
public static bool PingIP(string ip, int id)
{
Ping pingSender = new Ping();
//PingReply reply =
PingReply reply = pingSender.Send(ip, 120);
if (reply.Status == IPStatus.Success)
{
//ping的通
string upIp = "UPDATE t_jl0020_pst_no set ping_ok='N' where [email protected]_num";
SqlParameter[] par = new SqlParameter[]
{
new SqlParameter("@id_num",id)
};
SQLHelper.Update(upIp, par);
return true;
}
else
{
//ping不通
string upIp = "UPDATE t_jl0020_pst_no set ping_ok='N' where [email protected]_num";
SqlParameter[] par = new SqlParameter[]
{
new SqlParameter("@id_num",id)
};
SQLHelper.Update(upIp, par);
return false;
}
}
}
然后统计函数返回值
DataTable dt = SQLHelper.SelectTable("select id_num,com_ip from t_jl0020_pst_no");
var result = (from row in dt.Rows.Cast<DataRow>().AsParallel()
let ip = (string)row["com_ip"]
let id = int.Parse((string)row["_id_num"])
select new { ip, id, result = PingIP(ip, id) }).ToList();
这样就知道数据库表中都有哪些ip、id,以及并发(AsParallel)计算结果。