ThreadPool

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using WindowsFormsApplication3.Enums;
using WindowsFormsApplication3.DataStorge;
using WindowsFormsApplication3.Jobs;
using WindowsFormsApplication3.Jobs.Operation_System;

namespace WindowsFormsApplication3.FormPage
{
    public partial class ThreadPoolTest : BaseWorkerForm
    {
        protected int finishedChildFormNO;
        protected CheckoutStep checkoutStep;

        void execute_StateChangeEvent(string strTipInfo, int Number, bool IsEnd)
        {

            if (this.InvokeRequired)
            {
                this.BeginInvoke(new ExeCuteManager.DelArgInfo(DelPolfun), new object[] { strTipInfo, Number, IsEnd });
            }
            else
            {
                DelPolfun(strTipInfo, Number, IsEnd);
            }
        }

        private void DelPolfun(string strTipInfo, int Number, bool IsEnd)
        {
            this.listBox.Items.Add(strTipInfo);
            if (Number == 3 && IsEnd)
            {
                this.listBox.Items.Add(string.Format("所有的线程执行结束!"));
            }
        }
        public ThreadPoolTest(CheckoutContext checkoutContext, CheckoutStep checkoutStep)
            : base(checkoutContext, checkoutStep)
        {
            this.checkoutStep = checkoutStep;
            InitializeComponent();
            ResetForm();
            backgroundWorker.DoWork += backgroundWorker_DoWork;
            backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            bool isErrorFound = false;
             foreach (BaseJob job in jobs)
            {
                job.StateChangeEvent += execute_StateChangeEvent;
                WaitCallback callBack = new WaitCallback(job.Execute);
                ThreadPool.QueueUserWorkItem(callBack, 1);
                ThreadPool.QueueUserWorkItem(callBack, 2);
                ThreadPool.QueueUserWorkItem(callBack, 3);
                if (job.Status == JobStatus.Error)
                {
                    isErrorFound = true;
                    checkoutContext.logData.Error(checkoutStep, "Job error");
                }
                status = isErrorFound ? FormStatus.Error : FormStatus.OK;
                ReportStatusChanged();
            }

        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            timer.Stop();
            timer.Enabled = false;
            RefreshForm();
            ReportStatusChanged();
            checkoutContext.logData.Finish(checkoutStep, "");
        }

        public override void Execute()
        {
            ReportStatusChanged();
            checkoutContext.logData.Start(checkoutStep, "");
            base.Execute();
            backgroundWorker.RunWorkerAsync();
        }

        public override void ResetForm()
        {
            base.ResetForm();
            jobs.Add(new ExeCuteManager(checkoutContext,checkoutStep));

        }
    }
}

ThreadPool,布布扣,bubuko.com

时间: 2025-01-12 11:47:41

ThreadPool的相关文章

c#:ThreadPool实现并行分析,并实现线程同步结束

背景: 一般情况下,经常会遇到一个单线程程序时执行对CPU,MEMORY,IO利用率上不来,且速度慢下问题:那么,怎么解决这些问题呢? 据我个人经验来说有以下两种方式: 1.并行.多线程(Parallel.Task.ThreadPool) 2.多进程MutilpleProcess 恰好工作中又一次遇到单线程程序性能低的问题,本次我主要想尝试使用ThreadPool来实现多线程,并且在实现多线程任务同步结束. 测试代码: 1 static void Main(string[] args) 2 {

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题

ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序会出现闪退.当然是指不处理那个异常的情况下.这不公司的CMS在生产环境频频出现闪退的情况.该死的是,原来用老机器配置不高的情况下没有出现过.换了更好的新机器后出现的. // // 摘要: // 将方法排入队列以便执行,并指定包含该方法所用数据的对象.此方法在有线程池线程变得可用时执行. // //

boost之ThreadPool

boost之ThreadPool 版权声明:本文为博主原创文章,未经博主允许不得转载. threadpool是基于boost库实现的一个线程池子库,但线程池实现起来不是很复杂.我们从threadpool中又能学到什么东西呢? 它是基于boost库实现的,如果大家对boost库有兴趣,看看一个简单的实现还是可以学到点东西的. threadpool基本功能 1.任务封装,包括普通任务(task_func)和优先级任务(prio_task_func). 2.调度策略,包括fifo_scheduler(

C#多线程--线程池(ThreadPool)

先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程

ThreadPool.QueueUserWorkItem

ThreadPool.QueueUserWorkItem(_ => { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.baidu/tag/模特?page=" + pageNum); request.Credentials = System.Net.CredentialCache.DefaultCredentials; HttpWebResponse response = (HttpWe

线程(Thread)、线程池(ThreadPool)技术

线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数,在一个应用程序中,常常需要使用多个线程来处理不同的事情,这样可以提高程序的运行效率,也不会使主界面出现无响应的情况.在这里主要介绍线程(Thread).线程池(ThreadPool)两种不同创建线程的区别 在通常的情况下,当我们需要开启一个新的线程时,我们直接通过Thread(继承自 System.Threading;)去创建

C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem

class TestThread { static void Main() { //使用WaitHandle静态方法阻止一个线程,直到一个或多个同步对象接收到信号 WaitHandle[] waitHandles = new WaitHandle[] { new ManualResetEvent(false), new ManualResetEvent(false) }; WaitCallback waitCallback = new WaitCallback(MyThreadWork); Wa

ThreadPool线程池

1.GetMaxThreads,GetMinThreads class Program { static void Main(string[] args) { int workerThreads; int completePortsThreads; ThreadPool.GetMaxThreads(out workerThreads, out completePortsThreads); Console.WriteLine("线程池中最大的线程数{0},线程池中异步IO线程的最大数目{1}&qu

threadpool 测试

import paramiko import threadpool import time def ssh(hostname,port,username,password,cmd): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname,port,username,password) stdin,stdout,stderr = ssh.ex

C#异步线程调用之ThreadPool.QueueUserWorkItem()

项目中有大文件传输需求,用户在网页端填好某个IP下的共享目录,服务端通过所填路径检测共享目录下的文件以供用户选择待传输的文件, 用户勾选相应文件后点击提交,服务端遂开始执行文件传输.所有的逻辑过程都在同一后台代码中,传文件的代码和其他业务代码都在同一线程中, 因而在文件过大时用户所在页面要等待很久很久,极大地影响用户体验,所以后来将传文件的过程放在新的线程中,以便提高页面响应效率. 将文件传输过程放在新线程中使用的是ThreadPool.QueueUserWorkItem()方法,调用方式是: