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# 多线程编程之线程池的使用 (ThreadPool)

在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在...
  • zhanglong_longlong
  • zhanglong_longlong
  • 2013年04月25日 15:08
  • 655

C#多线程编程之线程池的使用 (ThreadPool)

在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在...
  • WuLex
  • WuLex
  • 2017年08月11日 15:49
  • 493

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

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

传智播客-多线程(7)-线程池

jdk5的并发类库里提供了一个重要的功能:线程池。 关于线程池的讲解,首先介绍在Tcp服务器编程模型的原理:对每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一...
  • fjf133
  • fjf133
  • 2010年03月05日 23:14
  • 877

C# 线程池和编程实例

C# 线程池和编程实例 一      线程池可以看做容纳线程的容器;     一个应用程序最多只能有一个线程池;     ThreadPool静态类通过QueueUserWorkItem()方法将工作...
  • bcbobo21cn
  • bcbobo21cn
  • 2015年05月09日 23:29
  • 812

Unity多线程、线程池的使用

C#多线程的使用Unity支持多线程,Unity支持多线程,Unity支持多线程,重要三遍。 当大家使用到Unity读取外界数据或者操作网格的时候,多线程会非常的好用,因为操作可能比较昂贵,多开辟一...
  • ksgt00629518
  • ksgt00629518
  • 2016年12月27日 13:48
  • 1128

[深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

简介  使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件、数据库、网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作。   这就可以使用线程来...
  • honantic
  • honantic
  • 2015年07月14日 22:17
  • 22101

C# 手动调用线程与线程池方式调用的开销对比

UseThreads为手工线程 UseThreadPool为线程池方式 static void Main(string[] args) { ...
  • conquerwave
  • conquerwave
  • 2016年03月04日 21:46
  • 563

c# socket线程池实现

服务器端:      PoolServer.cs类      using System; using System.Collections.Generic; using System.Te...
  • QQzyb
  • QQzyb
  • 2014年03月14日 17:38
  • 2395

C# Window编程随记——多线程和线程池

C# Window编程随记——多线程和线程池在进行C#编程时,我们常常遇到一些任务量很大的情况,例如在读取多个表格的数据,并且要创建多个文件来保存解析之后的数据时,假如只是用简单的for循环来完成的话...
  • linshuhe1
  • linshuhe1
  • 2015年10月21日 15:14
  • 943
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c# 线程池 多线程
举报原因:
原因补充:

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