C# 多线程任务分配辅助类
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 = ;
private int _threadCount = ; 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 = ; 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 = ; i < _threadCount; i++)
{
_resets[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { i, i });
}
//完成一个任务后在利用完成的那个线程执行下一个任务
int receivereset = ;
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)[].ToString());
int resetindex = int.Parse(((object[])arg)[].ToString());
if (WorkMethod != null)
{
WorkMethod(taskindex + , resetindex+);
}
_resets[resetindex].Set();
}
}
并且在任务完成后能触发CompleteEvent事件.
类中关键的是ManualResetEvent类的应用,能够在一个任务完成时通知程序哪个线程执行完毕,然后就安排另一个任务开始执行.
//实例化多线程辅助类并启动
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)
{
}
C# 多线程任务分配辅助类的更多相关文章
- CoutDownLatch 多线程同步辅助类
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- C# 多线程辅助类实现多任务
1)首先实现一个多线程的辅助类,代码如下: public class ThreadMulti { public delegate void DelegateComplete(); public del ...
- Java中多线程同步类 CountDownLatch
在多线程开发中,常常遇到希望一组线程完成之后在执行之后的操作,java提供了一个多线程同步辅助类,可以完成此类需求: 类中常见的方法: 其中构造方法:CountDownLatch(int count) ...
- Java中使用CountDownLatch进行多线程同步
CountDownLatch介绍 在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法: 1.synchronized关键字进行同步. 2.Lock锁接口及其实现类ReentrantL ...
- java线程一之创建线程、线程池以及多线程运行时间统计
线程和进程的基本概念 进程和线程是动态的概念. 进程是 "执行中的程序",是一个动词,而程序是一个名词,进程运行中程序的"代码",而且还有自己的 ...
- 使用 Rcpp
正如我们所提到的那样,并行计算只有在每次迭代都是独立的情况下才可行,这样最终结果才不会依赖运行顺序.然而,并非所有任务都像这样理想.因此,并行计算可能会受到影响.那么怎样才能使算法快速运行,并且可以轻 ...
- JUC知识点总结(知识点见内部目录)
目录 JUC是什么 锁 Synchronized VS Lock 实现差异 Synchronized & Lock 总结 Synchronized锁的对象是什么 生产者&消费者 只有两 ...
- 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute
[源码下载] 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationCont ...
- 多线程辅助类之CyclicBarrier(四)
CyclicBarrier是一个线程辅助类,和<多线程辅助类之CountDownLatch(三)>功能类似,都可以实现一组线程的相互等待.要说不通点,那就是CyclicBarrier在释放 ...
随机推荐
- 骨牌摆放方案数n*m(状压DP)
题意:https://www.nitacm.com/problem_show.php?pid=1378 如题. 思路: 从第一行for到最后一行,枚举每一行的所有状态,进行转移,注意答案是dp[最后一 ...
- mongodb 批量替换内容的语句
// 注意上面的集合要和下面的集合名称相同 db.rand_web_test.find( { 'content': /^.*要替换的字符串.*$/ } ).forEach( function (ite ...
- 作业2:java内存模型图示
参考:http://www.infoq.com/cn/minibooks/java_memory_model?utm_source=infoq&utm_campaign=user_page&a ...
- 使用 ASP.NET Core 的 gRPC 服务
将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...
- 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功
2019年9月18日17:09:27 什么黑猫举报没用 先关闭订阅 账户中心自助申请试试,不通过再进行下面这步 https://getsupport.apple.com/?caller=home&am ...
- parseInt()、Number()区别
parseInt从头解析string为整数,在遇到不能解析的字符时就返回已经解析的整数部分,如果第一个字符就不能解析,就直接返回NaN. Number如果无法转换为数字,就返回NaN.像“123a”, ...
- Asp.Net Server.MapPath()用法
做了一个上传文件的功能 本地测试没问题 部署到服务器之后 一直报错 由于 某些历史原因 看不到错误信息 最后发现是路径的问题 其实这么简单的问题 最早该想到的 ...... Server.MapPat ...
- CentOS7 使用光盘镜像作为yum源
1. 首先,如果是虚拟机,则确认guest有光驱并且处于激活状态,如果是真机则在光驱中插入光盘 :-) 2. mkdir /media/cdrom mount /dev/cdrom /media/c ...
- Linux下的用户和用户组,文件权限:chown和chmod
如下图所示,root权限下新建一个用户MasterBai, /etc/passwd文件中新加入一些信息 这个文件中,记录了该服务器的用户信息,如下图红色框起来的用户,就是我们自己创建的用户,而起来2- ...
- beego中获取url以及参数的方式
以下都全默认在controller下执行 获取当前请求的referer fmt.Println(this.Ctx.Request.Referer()) 输出:http://localhost:8080 ...