c# 线程池 后台目录扫描器

转载 2012年03月31日 14:07:26

http://apps.hi.baidu.com/share/detail/30009868

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Threading;
using System.Net;
using System.Windows.Forms.PropertyGridInternal;

namespace scan
{
    public partial class Form1 : Form
    {
       
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void functionDele();
        public functionDele doEvent;

        public delegate void functionDele1(string s);
        public functionDele1 doEvent1;

        bool tag = true;//是否停止,true为否
        private void button1_Click(object sender, EventArgs e)
        {
            tag = true;
            this.progressBar1.Value = 0;
            this.listBox1.Items.Clear();
            if (this.textBox1.Text.Trim() == "")
            {
                MessageBox.Show("先列举可能的后台目录");
                return;
            }
            if (this.textBox3.Text.Trim() == ""||this.textBox3.Text.Trim().ToLower()=="http://")
            {
                MessageBox.Show("输入网址不正确");
                return;
            }
            string[] strarr = this.textBox1.Text.Trim().Split(new string[]{ "\r\n" }, StringSplitOptions.None);//以回车分割成string数组
            WaitCallback waitcallback = new WaitCallback(DoWork);
            int count = strarr.Length;
            //Console.WriteLine(count); //用console.writeline是为了调试时候用view->output来查看的
           progressBar1.Maximum = count;
            ThreadPool.SetMaxThreads(30, 100);//最大线程数 超过30自动排队(threadpool自动管理)
            ThreadPool.SetMinThreads(20, 100);
            for (int i = 0; i < strarr.Length; i++)
            {
                ThreadPool.QueueUserWorkItem(waitcallback,strarr[i]);//把任务不断压入线程池;线程池自动创建若干个线程循环做事
            }
        }
        public void DoWork(object state)
        {
               if(!tag)//停止
                return;
            HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(this.textBox3.Text.Trim()+"/" + state.ToString() + "/");
            hwr.AllowAutoRedirect = false; //不允许重定向
            hwr.Timeout = 3000; //连接超时时间设置
            hwr.Method = "GET"; //协议:GET、HEAD、POST、PUT、DELETE、TRACE 或 OPTIONS。
            try
            {
               HttpWebResponse hwrs = (HttpWebResponse)hwr.GetResponse();
                if (hwrs.StatusCode == HttpStatusCode.OK) //获得http状态码 如:200但是404却捕捉不到
                {
                    //this.listBox1.Items.Add(this.textBox3.Text.Trim() + "/" + state.ToString() + "/");
                    if (doEvent1 != null)
                    {
                        this.BeginInvoke(doEvent1,new object[]{this.textBox3.Text.Trim() + "/" + state.ToString() + "/"});//
                        //过代理执行listbox项增加的方法,用的是ui线程的异步方法来执行(this)
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.ToString());
                if (ex.ToString().ToLower().IndexOf("403") != -1)//403禁止列目录 说明存在
                {
                    if (doEvent1 != null)
                    {
                        this.BeginInvoke(doEvent1, new object[] { this.textBox3.Text.Trim() + "/" + state.ToString() + "/" });//通
                        //过代理执行listbox项增加的方法,用的是ui线程的异步方法来执行(this)
                    }
                }
            }
            if (doEvent != null)
            {
                Thread.Sleep(1000);
                this.BeginInvoke(doEvent);//通过代理执行进度条值++的方法,用ui线程的异步方法执行该方法
            }
            //Console.WriteLine(this.progressBar1.Value);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Control.CheckForIllegalCrossThreadCalls = false; //线程间相互给控件属性赋值会冲突 ,用这个方法或用代理解决
            //textBox3.Click += new System.EventHandler(textBox3_Enter);//鼠标进入textbox触发该事件,执行选中所有文字的方法
            doEvent=new functionDele(addProgressBarvalue);//代理要执行的方法(progress进度条前进)
            doEvent1 = new functionDele1(addListBoxItem);//代理要执行的方法(listbox项增加)
        }
        private void button2_Click(object sender, EventArgs e)
        {//stop
            //this.progressBar1.Value = 0;
            tag = false;
        }

       private void textBox3_Enter(object sender, EventArgs e)
        {
           //textBox3.SelectAll(); //选中textbox的所有文字

        }
        void addProgressBarvalue()//进度条值++;
        {
            this.progressBar1.Value += 1;
        }
        void addListBoxItem(string s)//listbox项增加
        {
            this.listBox1.Items.Add(s);
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                //Clipboard.SetDataObject(this.listBox1.SelectedItem.ToString());//设置剪切板内容
                //MessageBox.Show(Clipboard.GetDataObject().GetData(DataFormats.Text,true).ToString());//获得剪切板内容
                System.Diagnostics.Process.Start("iexplore.exe", this.listBox1.SelectedItem.ToString());//ie打开该网址
            }
            catch { }
        }
    }
}

C# 线程池使用示例

  • 2017年12月04日 11:56
  • 30KB
  • 下载

基于线程池实现linux下守护进程运行web目录服务器

LInux先建立线程池,主函数监听套机字,accept后,将连接套接字投入线程池处理。 自己搞的这个线程池,暂时没有发现问题,运行效果还行。 虽然free是线程安全,不可重入的。但是我们并没使用静...

c#线程池相关.zip

  • 2015年01月04日 21:48
  • 1KB
  • 下载

C#管理线程池的类ThreadManager

  • 2009年04月18日 16:18
  • 7KB
  • 下载

C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定

题目:我现在有100个任务,需要多线程去完成,但是要限定同时并发数量不能超过5个。 原理:初始启用5个线程,然后让线程中的过程执行完毕之后,自己去取下一个任务,启动下一个线程。...
  • yzy85
  • yzy85
  • 2017年04月07日 22:34
  • 2332

C# smartthreadpool 智能线程池 VS2010

  • 2014年02月05日 14:57
  • 656KB
  • 下载

C# ——自定义线程池

  • 2010年04月16日 16:39
  • 27KB
  • 下载

C#线程与线程池使用介绍

应用程序可以拥有多个线程,当程序需要大量时间来处理部分业务或流程时,就可以通过线程来操作,如果应用程序没有用到线程,那将会出现很麻烦的事情,例如:界面上有个dataGridView需要填充数据,如果有...

C#自定义线程池

  • 2012年10月29日 10:16
  • 17KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 线程池 后台目录扫描器
举报原因:
原因补充:

(最多只允许输入30个字)