c#多线程并发执行一个操作函数
2013-05-13 16:41
309 查看
有时候我们进行很多的数据对比运算时,单线程的程序显得很慢,这个时候可以用多线程并发运行:
如果在for()循环外直接加 Messagebox.show("结束了"); 会发现 有时候已经弹出窗口了,但 仍有线程在运行。
这是因为for()循环虽然进行完了,但线程池中仍有线程在等待执行.
那我们什么时候才知道任务执行完了呢 这里我们要判断线程池中的线程是否执行完 执行完了 再弹出提示
int maxThread = 10; //10个并发线程 int currTNum = 0; WaitHandle[] whs = new WaitHandle[maxThread]; //WaitHanle类MSDN上的定义: 封装了一些对象,这些对象等待着独占访问共享资源,这里相当于占用10个资源的意思 for (int i = 0; i < whs.Length; i++) { whs[i] = new AutoResetEvent(false); //AutoResetEvent是一个开关,设置为true时,whs占用资源对象就会自动启动. 设置为false时,只有进行 AutoResetEvent.set()之后才能启动 } int sortIdx = 0; //循环遍历一千个参数,对这1000个参数进行并发执行 Dotask()函数 for (int i= 0;i<1000;i++) { var ex = i; currTNum++; //线程数加一 if (currTNum >= maxThread) { //当前线程数大于或者等于最大线程数时 ,即10个线程数全部被占满,这时等待释放资源,把释放资源的线程编号给sortldx int freeIdx = WaitHandle.WaitAny(whs); currTNum--; sortIdx = freeIdx; } else { //10个线程未占满时,依次给编号0到9 sortIdx = currTNum - 1; } //线程池队列,依次执行线程 ThreadPool.QueueUserWorkItem(new WaitCallback((p) => { Dotask(p); //要执行的函数,这里的p等于ex的内容 (whs[sortIdx] as AutoResetEvent).Set(); }), ex); //唤醒线程 }
如果在for()循环外直接加 Messagebox.show("结束了"); 会发现 有时候已经弹出窗口了,但 仍有线程在运行。
这是因为for()循环虽然进行完了,但线程池中仍有线程在等待执行.
那我们什么时候才知道任务执行完了呢 这里我们要判断线程池中的线程是否执行完 执行完了 再弹出提示
int maxWorkerThreads, workerThreads; int portThreads; ThreadPool.GetMaxThreads(out maxWorkerThreads, out portThreads); ThreadPool.GetAvailableThreads(out workerThreads, out portThreads); if (maxWorkerThreads - workerThreads == 0) { Messagebox.show("结束了"); break; }
相关文章推荐
- c#多线程并发执行一个操作函数
- 多线程线程池控制一个方法的并发量 限制只有5个线程执行任务
- 练习 2-7 编写一个函数invert(x, p, n),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位求反(即,1变成0,0变成1),x的其余各位保持不变。
- 线程操作-将一个函数在主线程执行的四种方法
- 多线程并发,同时执行一个表,避免数据缺失
- 练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 练习 2-6 编写一个函数setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- 2.6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- 练习2-6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 练习 2-6 编写一个函数 setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- c# 多线程执行一个函数
- 练习 2-7 编写一个函数 invert(x, p, n),该函数返回对x 执行下列操作后的结 果值:将x中从第p位开始的n个(二进制)位求反(即,1 变成0,0 变成1),x的其余各位保持不变。
- iOS学习笔记-119.多线程18——NSOperationQueue自定义NSOperation执行一个操作的取消
- SQLite并发操作下的分析与处理,解决database is locked,以及多线程下执行事务等问题
- 可供多线程调用的只能有一个在执行的原子操作实现
- 多线程同时只能一个现成操作文件
- C# 对一个函数设置执行的超时时间、函数执行的等待时间、等待结果的时间、允许的执行时间