当前位置: 代码迷 >> C# >> 多线程有关问题,大大们解答
  详细解决方案

多线程有关问题,大大们解答

热度:56   发布时间:2016-05-05 04:17:06.0
多线程问题,请教各位大大们解答!
我要实现一个先从数据库里读取所有电脑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
     }
}
}
------解决思路----------------------
引用:
我要实现一个先从数据库里读取所有电脑IP 取出来Ping,然后根据Ping结果来修改这张表的某一列,如何写。

你这个需求和多线程没神马关系
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)计算结果。
  相关解决方案