还是一个关于多线程查询数据库出现多个线程查出同一条记录的的问题。
表里本身有个字段,就是判断是否被查询过的。查询过的后的字段被改为false,就不再查询。
但是发觉还是一样,比如用了3线程,同一条记录还是被查处三次。
示例如下:
首先在form1类中
private static void createThread()
{
  for (int b = 0; b < 3; b++)
  {
    Thread thread = new Thread(new ThreadStart(sendMessage));
    thread.IsBackground = true;
    thread.Name = b.ToString();
    thread.Start();
  }
}private static void sendMessage()
{
    GetData getdata = new GetData();
    Record record = getdata.getNotSendMessage();
    ...
    ...
    //这里面有数个需要查询不同表的数据,都是getdata这个类中的方法
    Thread.Sleep(500);
    sendMessage();
}//GetData类中:
        public Record getNotSendMessage()
        {
            string sql = "getNotSendMessage";
            SqlDataReader reader = null;
            try
            {
                DBHelper dbhelp = new DBHelper();
                reader = dbhelp.ExecuteProcSelect(sql);
                if (reader.Read())
                {
                    Record record = new Record();
                    ...
                    ...
                    reader.Close();
                    return record;
                }
                reader.Close();
                dbhelp.closeConnection();
                return null;
            }
            catch (Exception e)
            {
                ...
                ...
            }
        }    ...
    ...   //也是数个查询方法//DBHelper 类中         public SqlConnection Connection
        {
            get
            {
                string connectionString ="数据库连接语句";
                
                if (connection == null)
                {
                    connection = new SqlConnection(connectionString);
                    connection.Open();
                }
                else if (connection.State == ConnectionState.Closed)
                {
                    connection.Open();
                }
                else if (connection.State ==ConnectionState.Broken)
                {
                    connection.Close();
                    connection.Open();
                }
                return connection;
            }
        }        public void closeConnection()
        {
            if (connection.State == ConnectionState.Open)
            {
                connection.Close();
            }
            else if (connection.State == System.Data.ConnectionState.Broken)
            {
                connection.Close();
            }
        }        public SqlDataReader ExecuteProcSelect(string procName, params SqlParameter[] values)
        {            SqlCommand cmd = new SqlCommand();
            cmd.Connection = Connection;
            cmd.CommandText = procName;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(values);
            SqlDataReader sdr = cmd.ExecuteReader();
            return sdr;
        }
    ...
    ...   现在主要的是sendMessage所有方法获取数据库中的数据如何让其不重复读取一条,
我试过用用lock都还是不行,在下很少用到线程..所请各位前辈帮帮忙!

解决方案 »

  1.   

    LockMe myLockMe
    Monitor.Enter(myLockMe);
    //监控器锁定重要代码段Monitor.Exit(myLockMe);
      

  2.   

    你可以先读取表记录到一个DataTable中 
    然后对这个DataTable采用多线程
      

  3.   

    单线速度太慢,就是把需要的数据库从不同的表取出数据之后,用webservice提交到远程服务器,提交给远程服务器这个过程是比较慢的。
      

  4.   

    LockMe myLockMe
    Monitor.Enter(myLockMe);
    //监控器锁定重要代码段Monitor.Exit(myLockMe);
    这个或者LOCK我都试过,必须把我的整个sendMessage()这个方法内容全部包含进去确实就是了。
    但是这样其实就跟单线程什么区别了呀。
    我想要的就是获取数据库的过程取出来不重复的,其它的照样运行,这样就可以先处理完提交给远程服务器的线程可以立即进行下一条..效率会高很多...因为取出数据库中的速度很快,但是提交给远程服务器的速度慢很多..
      

  5.   

    因为SQL执行语句是在另一个类里面的,但是我加了锁之后没反应。跟没加锁一样。