描述:
查询符合条件的数据,并通过URL的方式进行提交.
当查询到大量数据时,如何进行多线程提交?
当查询数据的时候(表中数据多点),CPU有时高点能占到30%-50%,我的表都做过索引.是不是可以用多线程查询?从而降低CPU??不知样样理解对不?我现在的源码:
private void time_send()
        {
            string sql="select * from TB where sendyorn=0"
                        SqlConnection con = conn();
            try
            {                SqlDataAdapter adap = new SqlDataAdapter(sql, con);                SqlCommandBuilder scb = new SqlCommandBuilder(adap);
                DataTable dt = new DataTable();
                adap.Fill(dt);
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                                         
                    url += "Username=" + this.t_uid.Text.ToString();                      
                    string success = succ_flag.Text.ToString();
                    string DOresult = this.DoUrl(url); //提交URL的方法                    dt.Rows[i]["sendyorn"] = 1; //置标识为1,为已检索
                    adap.Update(dt);
                    try
                    {
                        System.Threading.Thread.Sleep(300);  //这样写对不?
                    }
                    catch
                    {
                    }
                    Application.DoEvents();
                }
                             }
            catch (Exception ep)
            {
                this.log(ep.Message);
            }
            finally
            {                con.Close();
            }
          }

解决方案 »

  1.   

    1、你在写查询sql时,只返回需要的字段,不用的就不返回
    2、private void time_send()
            {
                string sql="select * from TB where sendyorn=0"
                            SqlConnection con = conn();
                try
                {                SqlDataAdapter adap = new SqlDataAdapter(sql, con);                SqlCommandBuilder scb = new SqlCommandBuilder(adap);
                    DataTable dt = new DataTable();
                    adap.Fill(dt);
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                                             
                        url += "Username=" + this.t_uid.Text.ToString();                      
                        string success = succ_flag.Text.ToString();
                        string DOresult = this.DoUrl(url); //提交URL的方法
                        dt.Rows[i]["sendyorn"] = 1; //置标识为1,为已检索
                        adap.Update(dt);
                        try
                        {
                            System.Threading.Thread.Sleep(300);  //这样写对不?
                        }
                        catch
                        {
                        }
                        Application.DoEvents();
                    }
                                 }
                catch (Exception ep)
                {
                    this.log(ep.Message);
                }
                finally
                {                con.Close();
                }
              }
    红色部分如果占用时间长,可以用异步调用
      

  2.   

    string DOresult = this.DoUrl(url); //提交URL的方法
     这个占用时间,因为要链接那个远程URL
    如何异步调用
      

  3.   

    多线程的代码:Thread t=new Thread(new ThreadStart(DoSomething));
    t.start();private void DoSomeThing(){
             //add code here
    }
      

  4.   

    简单的多线程写法: new Thread(new ThreadStart(delegate() {
                 //要在线程中执行的方法            
                })).Start();你上面写的不是多线程。而只是针对当前线程进行的操作。同样还是单线程。
      

  5.   

    可以。
    另外你的方法可能有参数。
    那么可以用这样的方法
    new Thread(new ParameterizedThreadStart(obj)).Start();
    但是只能一个参数。如果有方法有多个参数,要自己封装下方法,将多个参数放到一个对象传递过去。
      

  6.   

    我对这个线不太了解,那我对检索(select )出来的这1000条数据,在提交URL完成后,更新数据标志,
    那我是把提交和更新全放在线程里吗?会不会重复提交?
      

  7.   

    像我这种就可以。
            private void Form1_Load(object sender, EventArgs e)
            {
                new Thread(new ThreadStart(delegate() {
                    show("neirong", "biaoti");
                })).Start();
            }
            public void show(string text, string title)
            {
                MessageBox.Show(text, title);
            }
    如果你的方法中设计到调用其他控件,那就有点麻烦了。需要你写委托了。不然是不能在多线程中调用其他控件的。
      

  8.   

    delegate() 这个方法是干么的
      

  9.   

    string DOresult = this.DoUrl(url); //提交URL的方法
     我把这个方法放到线程 里,是不是提交速度可以大大提升?
      

  10.   

    private void time_send()
            {
                string sql="select * from TB where sendyorn=0"
                            SqlConnection con = conn();
                try
                {                SqlDataAdapter adap = new SqlDataAdapter(sql, con);                SqlCommandBuilder scb = new SqlCommandBuilder(adap);
                    DataTable dt = new DataTable();
                    adap.Fill(dt);
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                                             
                        url += "Username=" + this.t_uid.Text.ToString();                      
                        string success = succ_flag.Text.ToString();
                        string DOresult = this.DoUrl(url); //提交URL的方法,这个方法里面有没有涉及到其他控件?                    dt.Rows[i]["sendyorn"] = 1; //置标识为1,为已检索
                        adap.Update(dt);
                        /*try
                        {
                            System.Threading.Thread.Sleep(300);  //这样写对不?
                        }
                        catch
                        {
                        }
                        Application.DoEvents();*/不需要这一段
                    }
                                 }
                catch (Exception ep)
                {
                    this.log(ep.Message);//这里使用了this代表啥,是这个窗体?
                }
                finally
                {                con.Close();
                }
              }你的代码我引用了。里面有我的一些问题。你看看。回答了才能改
      

  11.   

    PS:如果你一个方法中的动作是有关联的:就是说如果B方法中引用到了A方法中的执行结果而你只是单独将A方法放在多线程中执行。这将造成程序的不稳定。因为有可能执行到B方法的时候A方法中的结果还没有执行出来。所以建议关联方法放在同一个线程中进行执行。
      

  12.   

    DoUrl这个方法中也用了:
     catch (WebException Ex)
                {
                    this.log(Ex.Message);
                }
    这个 this.log(ep.Message);//这里使用了this代表啥,是这个窗体?
    是个
     private void log(string msg)
            {            string time = DateTime.Now.ToString("yyyyMMdd HH:mm:ss:ffff");
                this.tb_log.Text = "【" + time + "】" + msg + "\r\n" + this.tb_log.Text;
            }
      

  13.   

    这个LOG的方法中包含了一个控件?这样不可以?
      

  14.   

    那就是说其实你的this并不需要。//定义控件委托
    deletage void delevoid0(string s);
    private void log(string msg)
      {
       Control ctl=(Control)tb_log;
     if(ctl.InvokeRequired)
     {
      delevoid0 d=new delevoid0(log);
    ctl.Invoke(d,new object[]{msg};
    return;
    }
      string time = DateTime.Now.ToString("yyyyMMdd HH:mm:ss:ffff");
      tb_log.Text = "【" + time + "】" + msg + "\r\n" + tb_log.Text;//你实际在多线程中只引用了这个tb_log控件。
      }
      

  15.   

    因为你包含了这个控件,所以要对这个控件进行设定,当其他线程调用它的时候。要将这个控件也进行委托。然后你其他方法里面调用这个方法的时候不要加this了。不然会认为你也对this进行了调用。(这个我没试,不过我想应该是这样子的吧。你试试惭愧。理解不精)
      

  16.   

    修改完这个方法。再去掉其他方法中引用这个方法时的this。就可以直接在多线程里面调用了。即:
    new Thread(new ThreadStart(delegate() {
                    time_send();
                })).Start();
      

  17.   

    我还想问一下,我的select用不用多线程呢?
      

  18.   

    我在这个time_send()方法里调用了控件:
    url += "Username=" + this.t_uid.Text.ToString();                      
                        string success = succ_flag.Text.ToString();
    这个也需要改是吧