c# 线程池 多线程

转载 2012年03月29日 15:57:59


1。设置参数类

using System;
using System.Collections.Generic;
using System.Text;


public class stateinfo
{
    public int cookie;
    public stateinfo(int icookie)
    {
        cookie = icookie;
    }
}

-----------------------------------------------------------------------------------------------------------

线程开启方法类

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Threading;
using System.Windows.Forms;


public class operthread
{
    public Hashtable hashcount;
    public ManualResetEvent mrevent;
    public static int icount = 0;
    public static int imaxcount = 0;
    public static ListBox lis;
    public operthread(int maxcount)
    {
        hashcount = new Hashtable(maxcount);
        imaxcount = maxcount;
    }
    public void beta(Object state)
    {
        //这写线程处理事件
        lis.Items.Add(Thread.CurrentThread.GetHashCode().ToString() +"-"+ ((stateinfo)state).cookie.ToString());
        lis.Items.Add(hashcount.Count.ToString()+"-"+Thread.CurrentThread.GetHashCode().ToString());
        lis.Items.Add("-------------------------");
        lock (hashcount)
        {
            if (!hashcount.ContainsKey(Thread.CurrentThread.GetHashCode()))
            {
                hashcount.Add(Thread.CurrentThread.GetHashCode(), 0);
                hashcount[Thread.CurrentThread.GetHashCode()] = ((int)hashcount[Thread.CurrentThread.GetHashCode()]) + 1;
            }
        }
        Thread.Sleep(1000);
        Interlocked.Increment(ref icount);//原子操作递增变量存储
        if (icount == imaxcount)
        {
            lis.Items.Add("加载:"+icount.ToString());
            lis.Refresh();
            mrevent.Set();//将线程设置成终止
        }
    }
}

------------------------------------------------------------------------------------

队列如线程池:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Threading;
using System.Windows.Forms;

/// <summary>
/// simppool 的摘要说明
/// </summary>
public class simppool
{
public simppool()
{
  
}
    public static int main(ListBox lis)
    {
        bool flag = false;
        int maxcount = 10;
        ManualResetEvent mrevent = new ManualResetEvent(false);
        lis.Items.Add("Queuing"+ maxcount.ToString()+"items to Thread Pool");//线程总数
        lis.Refresh();
        operthread operthread1 = new operthread(maxcount);
        operthread1.mrevent = mrevent;
        try
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(operthread1.beta),new stateinfo(0));
            flag = true;//判断线程是否可队列
        }
        catch (NotSupportedException e1)
        {
            lis.Items.Add("出错了!操作系统版本太低需要win2000以上系统。");
            lis.Refresh();
        }
        if (flag)
        {
            for (int iitem = 1; iitem <= maxcount; iitem++)//循环开启线程进入队列
            {
                lis.Items.Add("插入队列:"+ iitem.ToString());
                lis.Refresh();
                ThreadPool.QueueUserWorkItem(new WaitCallback(operthread1.beta), new stateinfo(iitem));//将线程插入队列
            }
            lis.Items.Add("等待线程时间完成........");
            lis.Refresh();;
            mrevent.WaitOne(Timeout.Infinite, true);
            lis.Items.Add("加载线程.....");
            foreach (object o in operthread1.hashcount.Keys)//查看开启线程的总数
            {
                lis.Items.Add(o.ToString() + "-" + operthread1.hashcount[o].ToString());
                lis.Refresh();
            }
        }
        //Console.ReadLine();
        return 0;
    }
}

-----------------------------------------------------------------------------------------

调用

private void button3_Click(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;//允许线程访问控件
            operthread.lis = listBox1;
            simppool.main(listBox1);
        }



---by : 冰火战地


相关文章推荐

C# 多线程的自动管理(线程池)

在多线程的程序中,经常会出现两种情况:     1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应。这一般使用 ThreadPool(线程池)来解决。      2...

多线程框架线程池编程

  • 2012年08月09日 17:11
  • 521KB
  • 下载

C# 多线程学习(六)线程池(ThreadPool)——线程资源的复用和自动管理

什么是线程池大家都知道,我们在打开一个应用的时候,操作系统是要做很多的事情的,动态链接、装载、分配虚拟空间、等等等等,其实一个应用的打开同时也伴随着一个进程的建立。进程的建立是需要时间的,在进程上开线...

C# 多线程、异步线程、线程池相关知识

/* 线程池ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数。池中的最大线程数是可配置的。 在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。也可以指定在创建线...

C# 多线程的自动管理(线程池)

在多线程的程序中,经常会出现两种情况:     1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应。这一般使用 ThreadPool(线程池)来解决。      2....
  • ksp416
  • ksp416
  • 2015年08月26日 12:02
  • 253

『C#基础』多线程笔记「四」线程池

现在到了关于多线最简单使用的最后一篇笔记。 无论从什么角度来看,每一项事物都应该有其所在的空间,而对于线程来说,线程池就是它所存在的空间,或者叫容器了。   接下来,看看这个线程池是如何使用的吧...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 线程池 多线程
举报原因:
原因补充:

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