C# 多线程辅助类实现多任务

摘要
最近项目中要做一个大数据量的操作,耗时很长,所以要用多线程来提高程序的执行速度.
因此写了一个多线程的辅助类,能够实现设置多线程的个数,然后就能重复利用这几个线程执行分配的任务.
可以说是一个多线程的简单应用,没什么高深的技术,希望园子的大牛多多指点:)

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

ContractedBlock.gif ExpandedBlockStart.gif Code
    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

转载于:https://www.cnblogs.com/zrx401558287/archive/2009/08/07/1541391.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超级多的C#辅助类大全 网上有各式各样的帮助类,公共类,但是比较零碎,经常有人再群里或者各种社交账号上问有没有这个helper,那个helper,于是萌生了收集全部helper的念头,以便日后使用。各式各样的几乎都能找到,所有功能性代码都是独立的类,类与类之间没有联系,可以单独引用至项目。 1. C#读取AD域里用户名或组 2. Chart图形 3. cmd 4. Cookie&Session 5. CSV文件转换 6. DataTable转实体 7. DBHelper 8. DecimalUtility及中文大写数字 9. DLL 10. Excel操作类 11. FTP操作类 12. H5-微信 13. Html操作类 14. INI文件读写类 15. IP辅助类 16. Javascript 17. Json 18. JSON操作 19. JS操作 20. Lib 21. Mime 22. Net 23. NPOI 24. obj 25. packages 26. Path 27. PDF 28. Properties 29. QueryString 地址栏参数 30. RDLC直接打印帮助类 31. ResourceManager 32. RMB 33. SqlHelper 34. SQL语句拦截器 35. URL的操作类 36. VerifyCode 37. XML操作类 38. 上传下载 39. 二维码操作类 40. 共用工具类 41. 其他 42. 分词辅助类 43. 分页 44. 加密解密 45. 压缩解压缩 46. 各种验证帮助类 47. 图片 48. 图片操作类 49. 图片验证码 50. 处理多媒体的公共类 51. 处理枚举类 52. 字符串 53. 对象转换处理 54. 帮助文档 55. 序列化 56. 异步线程 57. 弹出消息类 58. 数据展示控件绑定数据类 59. 文件操作类 60. 日历 61. 日志 62. 时间戳 63. 时间操作类 64. 条形码 65. 条形码帮助类 66. 条形码转HTML 67. 检测是否有Sql危险字符 68. 正则表达式 69. 汉字转拼音 70. 注册表操作类 71. 科学计数,数学 72. 类型转换 73. 系统操作相关的公共类 74. 缓存 75. 网站安全 76. 网站路径操作类 77. 网络 78. 视频帮助类 79. 视频转换类 80. 计划任务 81. 邮件 82. 邮件2 83. 配置文件操作类 84. 阿里云 85. 随机数类 86. 页面辅助类 87. 验证码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值