在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
C#的线程池使用起来还是非常简单的,这里记录一下。 根据http://blog.csdn.net/chen_zw/article/details/7939834里的描述这里记录一下C#线程池的特点
在使用线程池的时候,需要初始化其状态 ManualResetEvent eventX = new ManualResetEvent(false);//表示线程池的状态 false代表非终结状态 根据https://www.cnblogs.com/tianboblog/p/5393444.html介绍: 当初始化为true时,为终止状态 static ManualResetEvent _mre = new ManualResetEvent( true );
当初始化为false时,为非终止状态 static ManualResetEvent _mre = new ManualResetEvent( false );
终止状态时WaitOne()允许线程访问下边的语句 非终止状态时WaitOne()阻塞线程,不允许线程访问下边的语句 把非终止状态改为终止状态用Set()方法 把终止状态改为非终止状态用Reset()方法 //按钮事件 private void btnBatchSend_Click(object sender, RoutedEventArgs e) eventX.Reset(); 以上两句必须都有才行 //循环设置执行对象, for (int i = 0; i < list.Count; i++) ThreadPool.QueueUserWorkItem(tranSend, oj);// } eventX.WaitOne();//当是非终结状态时,会阻塞主线程 } worker.RunWorkerCompleted += (o, ea) =>
//每个线程将会执行的任务 private void tranSend(object order) Order s = order as Order; //当是最后一个order 或者 用户点了停止按钮时 //真正的执行任务代码 }
可以看出来熟练C#线程池的使用主要是控制好信号灯的状态,当主线程往下执行时,for循环里的代码会很快执行完毕,虽然最多只允许了十个线程同时活动,但十个之后的对象已经加入了队列,需要中断时,需要在执行任务里去自行判断。 if (s.IsLas || Break) |
请发表评论