1)首先实现一个多线程的辅助类,代码如下:

  public class ThreadMulti
{
public delegate void DelegateComplete();
public delegate void DelegateWork(int taskindex,int threadindex); public DelegateComplete CompleteEvent;
public DelegateWork WorkMethod; private ManualResetEvent[] _resets;
private int _taskCount = 0;
private int _threadCount = 5; public ThreadMulti(int taskcount)
{
_taskCount = taskcount;
} public ThreadMulti(int taskcount, int threadCount)
{
_taskCount = taskcount;
_threadCount = threadCount;
} public void Start()
{
if (_taskCount < _threadCount)
{
//任务数小于线程数的
_resets = new ManualResetEvent[_taskCount];
for (int j = 0; j < _taskCount; j++)
{
_resets[j] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { j, j });
}
}
else
{
_resets = new ManualResetEvent[_threadCount];
//任务数大于线程数 先把线程数的任务启动
for (int i = 0; i < _threadCount; i++)
{
_resets[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { i, i });
}
//完成一个任务后在利用完成的那个线程执行下一个任务
int receivereset = 0;
receivereset = ManualResetEvent.WaitAny(_resets);
for (int l = _threadCount; l < _taskCount; l++)
{
_resets[receivereset].Reset();
ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { l, receivereset });
receivereset = ManualResetEvent.WaitAny(_resets);
}
} ManualResetEvent.WaitAll(_resets);
if (CompleteEvent != null)
{
CompleteEvent();
}
} public void Work(object arg)
{
int taskindex = int.Parse(((object[])arg)[0].ToString());
int resetindex = int.Parse(((object[])arg)[1].ToString());
if (WorkMethod != null)
{
WorkMethod(taskindex + 1, resetindex+1);
}
_resets[resetindex].Set();
}
}

  ThreadMulti类能够根据根据传入的任务数和线程数,实现多线程的重复利用并执行指定的WorkMethod.
并且在任务完成后能触发CompleteEvent事件.
类中关键的是ManualResetEvent类的应用,能够在一个任务完成时通知程序哪个线程执行完毕,然后就安排另一个任务开始执行.

2)辅助类的应用应该挺简单吧

//实例化多线程辅助类并启动
ThreadMulti thread = new ThreadMulti(workcount); thread.WorkMethod = new ThreadMulti.DelegateWork(DoWork);//执行任务的函数
thread.CompleteEvent = new ThreadMulti.DelegateComplete(WorkComplete);//所有任务执行完毕的事件
thread.Start();

  只需要指定任务数和执行任务的函数和完成任务后的事件即可.调用Start方法后,DoWork会在线程中调用并传递任务的index和执行线程的index.

  public void DoWork(int index,int threadindex)
{
}

  我们可以根据传进来的index来操作相应的数据,比如我们要导入一个大数据量的表到数据库中,我们可以根据分页函数把整个表分成若干个页,也就相当于我们程序中的任务,根据pageindex来到数据库中加载指定的页的数据然后对数据操作整理后可以插入到指定的表中.
在DoWork中当然可以显示执行的进度信息等等.

示例
截图

下载
/Files/zrx401558287/ThreadMultiPro.rar
听取了大家的意见做了一个修改版,确实比以前的专业了很多,尤其感谢老羽的宝贵意见,让我又长了见识了 呵呵
下面是新的修改版,希望大家多提建议啊
/Files/zrx401558287/ThreadMultiProNew.rar
完成了停止的功能,并且根据Hawker的建议精简了start方法,下面是更新的程序,大家看看怎么样:)
/Files/zrx401558287/ThreadMultiPro09081418.rar

C# 多线程辅助类实现多任务的更多相关文章

  1. 多线程辅助类之CyclicBarrier(四)

    CyclicBarrier是一个线程辅助类,和<多线程辅助类之CountDownLatch(三)>功能类似,都可以实现一组线程的相互等待.要说不通点,那就是CyclicBarrier在释放 ...

  2. 多线程辅助类之CountDownLatch(三)

    CountDownLatch信号灯是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.它可以实现多线程的同步互斥功能,和wait和notify方法实现功能类似,具体 ...

  3. 多线程辅助类-CountDownLatch的用法

    转自:http://www.iteye.com/topic/1002652 CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方 ...

  4. python多线程实现多任务

    #转载请联系 1.什么是线程? 进程是操作系统分配程序执行资源的单位,而线程是进程的一个实体,是CPU调度和分配的单位.一个进程肯定有一个主线程,我们可以在一个进程里创建多个线程来实现多任务. --- ...

  5. C# 多线程任务分配辅助类

    1)首先实现一个多线程的辅助类,代码如下: public class ThreadMulti { public delegate void DelegateComplete(); public del ...

  6. JAVA 多线程和并发学习笔记(四)

    1. 多进程 实现并发最直接的方式是在操作系统级别使用进程,进程是运行在它自己的地址空间内的自包容的程序.多任务操作系统可以通过周期性地将CPU从一个进程切换到另一个进程,来实现同时运行多个进程. 尽 ...

  7. 黑马程序员_Java基础:多线程总结

    ------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任 ...

  8. java多线程功力

    一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式.多线程编程可以使程序具有两条或两条以上的并发执行线索. 进程是指一个内存中运行的应用程序,每个进程都有自己 ...

  9. java多线程编程--基础篇

    一.基本概念 a.操作系统中进程与线程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间, 一个进程中可以启动 ...

随机推荐

  1. PAT 1029 旧键盘

    https://pintia.cn/problem-sets/994805260223102976/problems/994805292322111488 旧键盘上坏了几个键,于是在敲一段文字的时候, ...

  2. VirtualBox 导入虚拟机时的注意事项 VDI 与VMDK

    1. 建议不要勾选  as vdi   vmdk 最好不过了.. 长个经验教训 以后尽量不勾选 vmdk 有很多工具能进行转换 vdi的 要麻烦一些.

  3. [转帖]紫光展锐5G芯片

    紫光展锐5G芯片已流片:7nm工艺 2019年问世   https://news.mydrivers.com/1/612/612346.htm 本文转载自超能网,其他媒体转载需经超能网同意 高通骁龙X ...

  4. TFS2018 linux Agent的安装

    1. 感谢徐蕾老师的文档,根据文档简单学会了TFS agent的安装,在此简单记录一下: 前置条件: CentOS7.4 or CentOS7.5的版本 安装的软件有git 2.17 dotnet s ...

  5. 项目引入android-support-v7-appcompat遇到的问题,no resource found that matches the given name 'android:Theme.AppCompat.Light'

    一.问题 今天准备使用v7包中的ToolBar来用,但是在styles.xml中引入Theme.AppCompat.Light的时候,报错“no resource found that matches ...

  6. React 多组件传值props和this

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  7. rsync实现数据同步

    希望两台机器指定目录的数据保持一致 192.168.19.252(master)                 192.168.19.251(slave) /cache 拉复制            ...

  8. ZOJ2836-Number Puzzle-容斥原理

    依次考虑一个数的倍数,两个数的倍数(lcm),三个数的倍数(lcm)... 会发现有这么一个规律,奇数个数时要加上情况数,偶数个数时要减去情况数. 一种只有10个数,用二进制枚举所有情况即可. #in ...

  9. hdu 4348 To the moon (主席树 区间更新)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4348 题意: 4种操作: C l r c   区间[l,r]加c,时间+1 Q l r    询问当前时 ...

  10. Linux 系统免密码登陆远程服务器

    在当前Linux生成公钥私钥ssh-keygen公钥私钥存放路径为:~/root/.ssh/id_rsa id_rsa.pub 登陆被远程主机,进入目录~/root/.ssh/是否存在authoriz ...