已经写好了,是多线程的,可以识别验证码自动登陆的发贴机器人,经过实验发现开3个线程的时候效率最高,开再多的线程速度反而慢下来了,但是随后又发现,几个发贴机器人一起开,每个开3线程,总的效率提升非常多,这是为什么?
如果我想只开一个多线程的,让他效率最高,怎么做.
using System;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Drawing;
using System.Threading;
using System.Timers;namespace WindowsFormsApplication1
{
  public partial class Form1 : Form
  {
  int[] htable = new int[10] { 1470, 1896, 1875, 1465, 1543, 1592, 1526, 2437, 1379, 1739 };
  static CookieCollection cookiecoll;
  Encoding coding = Encoding.GetEncoding("UTF-8");
  bool bstart = false;
  int iFreq = 2;
  static int count = 0;
  static bool isDD = false;
  AutoResetEvent autoevent = new AutoResetEvent(true);
  Thread[] newThread = new Thread[50];
  static Thread kongzhi;  private string GetsRand()              //识别验证码
  {
  int i, j;
  string sRand = null;
  try
  {
  HttpWebRequest request;
  HttpWebResponse response;
  request = (HttpWebRequest)WebRequest.Create(@"验证码图片地址");
  request.CookieContainer = new CookieContainer();
  request.Timeout = 200;
  request.CookieContainer.Add(cookiecoll);
  request.ServicePoint.Expect100Continue = false;
  response = (HttpWebResponse)request.GetResponse();
  Stream rp = response.GetResponseStream();
  Bitmap bmap = new Bitmap(rp);
  for (int num = 0; num <= 3; num++)
  {
  Bitmap bbmp = bmap.Clone(new Rectangle(4 + 14 * num, 4, 8, 16), bmap.PixelFormat);
  Color cc = bbmp.GetPixel(4, 0);
  int hash = 0;
  for (i = 0; i <= 7; i++)
  {
  for (j = 0; j <= 15; j++)
  {
  if (cc != bbmp.GetPixel(i, j))
  {
  bbmp.SetPixel(i, j, Color.White);
  hash += i * j;
  }
  else
  {
  bbmp.SetPixel(i, j, Color.Black);
  }
  }
  }
  for (i = 0; i <= 9; i++)
  if (htable[i] == hash)
  break;
  sRand += i.ToString();
  }
  response.Close();
  }
  catch (System.Exception ex)
  {
  //MessageBox.Show(ex.ToString());
  }
  return sRand;
  }  public Form1()
  {
  InitializeComponent();
  }

解决方案 »

  1.   

      public void click(object sender, System.EventArgs e)
      {
      if (this.Visible)
      {
      this.Visible = false;
      this.Hide();
      this.WindowState = FormWindowState.Minimized;
      }
      else
      {
      this.Visible = true;
      this.Show();
      this.WindowState = FormWindowState.Normal;
      }
      }  private void Form1_Load(object sender, EventArgs e)
      {
      notifyIcon1.Icon = new Icon("MSN.ICO");
      notifyIcon1.Text = "";
      notifyIcon1.Visible = true;
      notifyIcon1.Click += new System.EventHandler(this.click);
      dateTimePicker1.MouseWheel += new MouseEventHandler(dateTimepicker1_mousewheel);
      }  private void dateTimepicker1_mousewheel(object sender, System.Windows.Forms.MouseEventArgs e)
      {  }  private void vv()   //刷
      {
      while (true)
      {
      try
      {
      HttpWebRequest request;
      HttpWebResponse response;
      byte[] bdata;
      string postMessage, rand;
      rand = GetsRand();
      request = (HttpWebRequest)WebRequest.Create(@"");
      request.CookieContainer = new CookieContainer();
      request.Timeout = 200;
      request.CookieContainer.Add(cookiecoll);
      request.Method = "POST";
      request.AllowAutoRedirect = false;
      request.ServicePoint.Expect100Continue = false;
      request.KeepAlive = true;
      request.Referer = @"";
      request.Accept = @"application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
      request.UserAgent = @"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
      request.Host = @"";
      request.ContentType = @"application/x-www-form-urlencoded";
      postMessage = @"selectionId=" + rand;
      bdata = coding.GetBytes(postMessage);
      request.ContentLength = bdata.Length;
      request.GetRequestStream().Write(bdata, 0, bdata.Length);
      request.GetRequestStream().Flush();
      request.GetRequestStream().Close();
      response = (HttpWebResponse)request.GetResponse();
      StreamReader readStream = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      response.Close();
      count++;
      this.Invalidate();
      this.Update();
      Thread.Sleep(20);
      }
      catch (System.Exception ex)
      {
      }
      }
      }  private void kz()        //制造线程
      {
      for (int i = 0; i < iFreq; i++)
      {
      newThread[i] = new Thread(vv);
      newThread[i].IsBackground = true;
      newThread[i].Start();
      Thread.Sleep(40);
      }
      autoevent.WaitOne();
      for (int i = 0; i < iFreq; i++)
      newThread[i].Abort();
      }  private void button1_Click(object sender, EventArgs e)
      {
      HttpWebRequest request;
      HttpWebResponse response;
      byte[] bdata;
      string postMessage, rand;  if (bstart)
      {
      button1.Text = "开始";
      bstart = false;
      autoevent.Set();
      }
      else
      {
      timer1.Stop();
      button2.Text = "定时";
      button1.Text = "停止";
      bstart = true;
      autoevent.Reset();
      try
      {
      request = (HttpWebRequest)WebRequest.Create(@"");
      request.CookieContainer = new CookieContainer();
      request.Timeout = 1000;
      request.ServicePoint.Expect100Continue = false;
      response = (HttpWebResponse)request.GetResponse();
      cookiecoll = response.Cookies;
      response.Close();  rand = GetsRand();
      request = (HttpWebRequest)WebRequest.Create(@"");
      request.CookieContainer = new CookieContainer();
      request.Timeout = 1000;
      request.CookieContainer.Add(cookiecoll);
      request.Method = "POST";
      request.ServicePoint.Expect100Continue = false;
      request.AllowAutoRedirect = false;
      request.KeepAlive = true;
      request.Accept = @"application/x-shockwave-flash, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
      request.UserAgent = @"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
      request.Referer = @"";
      request.Host = @"";
      request.ContentType = @"application/x-www-form-urlencoded";
      postMessage = @"";
      bdata = coding.GetBytes(postMessage);
      request.ContentLength = bdata.Length;
      request.GetRequestStream().Write(bdata, 0, bdata.Length);
      request.GetRequestStream().Flush();
      request.GetRequestStream().Close();
      StreamReader readStream = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
      response.Close();
      kongzhi = new Thread(kz);
      kongzhi.Start();
      }
      catch (System.Exception ex)
      {
      }
      }
      }  private void numericUpDown1_ValueChanged(object sender, EventArgs e)
      {
      iFreq = (int)numericUpDown1.Value;
      }  private void Form1_FormClosed(object sender, FormClosedEventArgs e)
      {
      Application.Exit();
      }  private void Form1_Paint(object sender, PaintEventArgs e)
      {
      label4.Text = "已刷" + count.ToString() + "次";
      }  private void Form1_SizeChanged(object sender, EventArgs e)
      {
      if (this.WindowState == FormWindowState.Minimized)
      {
      this.Hide();
      }
      }  private void timer1_Tick(object sender, EventArgs e)
      {
      button1_Click(sender, e);
      }  private void button2_Click(object sender, EventArgs e)
      {
      if ((isDD) || (bstart))
      {
      button2.Text = "定时";
      isDD = false;
      timer1.Stop();
      }
      else
      {
      System.DateTime now = System.DateTime.Now;
      if (now.CompareTo(dateTimePicker1.Value) > 0)
      return;
      timer1.Interval = (int)dateTimePicker1.Value.Subtract(now).TotalMilliseconds;
      isDD = true;
      button2.Text = "停止";
      timer1.Start();
      }
      }
      }
    }
      

  2.   

    可能是Thread.Sleep()的问题,不要用这个,让当前线程Sleep();