C#多线程及控制线程数量,对for循环输出效率。

虽然输出不规律,但是效率明显提高。

思路:

如果要删除1000条数据,只使用for循环,则一个接着一个输出。所以,把1000条数据分成seed段,每段10条数据。

int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1;

注:createCount.Value的值是具体输出数据的数量

这里把数据分配给seed个线程去处理,每个线程只输出10个数据。

        int threadCountTmp = 0;//任务线程分派数
private void btnCreate_Click(object sender, EventArgs e)
{
int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1; for (int i = 0; i < seed; i++)
{
Thread threadTmp = new Thread(new ParameterizedThreadStart(TempOut));
threadTmp.Start(i);
threadCountTmp++;
Application.DoEvents();//响应窗口状态
while (true) { if (threadCountTmp < 10) break; }//推拉窗式控制多线程 线程数10
}
}
//分段后的数据发布给其它线程
public void TempOut(object o)
{
int tmp=Convert.ToInt32(o)*10;
int i = tmp;
for (; i < (tmp+10<=createCount.Value?tmp+10:createCount.Value); i++)
{
Thread thread = new Thread(new ParameterizedThreadStart(ResultOut));
thread.Start(i);
threadCount++;
while (true) { if (threadCount < 10) break; }//推拉窗式控制多线程 线程数10
}
threadCountTmp--;
}

分段后,再将分段后的数据分配给其它线程来处理,这样就能多线程同时工作了,由于要对控件操作,所以使用多线程的话要依靠委托来实现多线程对控件的控制。所以最后一步的输出,如下:

        delegate void TextTmp(object o);//声明委托
int threadCount = 0;//任务线程
//委托函数
public void ResultOut(object o)
{
if (!txtResult.InvokeRequired)
{
txtResult.Text = "\n" + f_groundcode.Text + "," + f_ticketno.Text + DateTime.Now.ToLongDateString().Replace("-", "") + GetZero(6 - o.ToString().Length) + o.ToString() + "," + DateTime.Now.ToLongDateString().Replace("-", "") + DateTime.Now.ToLongTimeString().Replace(":", "") + txtResult.Text;
}
else
{
TextTmp tmpDel = new TextTmp(ResultOut);
this.Invoke(tmpDel,o);
}
threadCount--;
}

因为我的数据要保证位数,所以要对0做简单处理。例如 我要输出

000000

000001

000002

000003

........

从上面的代码可以看出,我是使用for来递增的。所以是整型,前面的0随着数值的大小不断改变个数。

        //处理数字前面有多少个0
private string GetZero(int leng)
{
string result = "";
for (int i = 0; i < leng; i++)
{
result += "0";
}
return result;
}

好了。简单的多线程处理。希望大家可以学习。欢迎大家指导~~

C# 多线程、控制线程数提高循环输出效率的更多相关文章

  1. [转载]C# 多线程、控制线程数提高循环输出效率

    C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...

  2. Python SSH爆破以及Python3线程池控制线程数

    源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8 __author_ ...

  3. JAVA基础知识之多线程——控制线程

    join线程 在某个线程中调用其他线程的join()方法,就会使当前线程进入阻塞状态,直到被join线程执行完为止.join方法类似于wait, 通常会在主线程中调用别的线程的join方法,这样可以保 ...

  4. python多线程,限制线程数

    #encoding:utf8 import threading import time data = 0 def func(sleeptime): global data print threadin ...

  5. Java多线程 - 控制线程

    join线程 在某个线程的执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的线程完成为止. join()方法有三种重载形式: join():等待被join的线程执 ...

  6. Java多线程之如何确定线程数

    关于多线程的线程数的确定,最近研读过几篇paper,在此做一下笔记,方便使用时翻看. 1.<Java 虚拟机并发编程>中介绍 就是说:线程数 =  CPU的核心数 * (1 - 阻塞系数) ...

  7. 多线程编程_控制并发线程数的Semaphore

    简介 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源.很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是 ...

  8. Java多线程开发系列之四:玩转多线程(线程的控制1)

    在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...

  9. Java多线程之线程的控制

    Java多线程之线程的控制 线程中的7 种非常重要的状态:  初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...

随机推荐

  1. doubango库改动Contact内容的地方

    要在手机client中实现会议功能,从音频会议開始(可能会优点理点).server用的是Centos7 64 + Freeswitch1.4.client是基于doubango的imsdroid.还有 ...

  2. Android Design Support Library(2)- TextInputLayout的使用

    原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50494634 这篇文章介绍下Android Design Support Lib ...

  3. Material Design Get Started

    使用Material Design设计应用: Take a look at the material design specification. Apply the material theme to ...

  4. JQuery EasyUI DataGrid动态合并单元格

    /**        * EasyUI DataGrid根据字段动态合并单元格        * @param fldList 要合并table的id        * @param fldList ...

  5. 并发insert情况下数据重复插入问题的解决方案

    背景介绍 通常我们在接口里要保存一条数据时,会先判断该条记录在数据库里是否存在,如果不存在就插入,如果存在就返回已经存在. 就拿常见的工单来举例 Order order = orderService. ...

  6. dede频道标签channel和频道内容标签channelartlist的调用栏目名的不同方式,如果错误使用标签会发生错误

    频道标签 [field:typename/] 频道内容标签 {dede:field name='typename'/}

  7. JavaWeb学习总结第四篇--Servlet开发

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  8. leetCode 90.Subsets II(子集II) 解题思路和方法

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  9. WCF配置心得

    根据蒋金楠老师的博文所说的, WCF的终结点有三个要素组成,分别是地址(Address).绑定(Binding)和契约(Contract),简记可写成Endpoint = ABC. 地址:地址决定了服 ...

  10. Git --更改远程分支名

    git更新远程分支名字 git checkout old_branch git branch -m old_branch new_branch git push --delete origin old ...