当前第2页 返回上一页
一般情况下,“工作”交给线程池后,就不受控制了, 它会由处理器自动决定什么时候开始执行(当然是有空闲线程才行)。可以通过以下代码,让工作在指定时候以后再开始执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ManualResetEvent mManualEvent; public void Main()
{
mManualEvent = new ManualResetEvent(false);
Console.WriteLine( "{0} 任务已经交给线程池了,但是它没有执行." , DateTime.Now.ToString( "HH:mm:ss" ));
Thread.Sleep(10000);
Console.ReadKey();
{
mManualEvent.WaitOne();
{
Console.WriteLine( "Running Thread {0},Step {1}" , Thread.CurrentThread.ManagedThreadId, i);
Thread.Sleep(500);
}
}
|
运行结果:
这里在将工作交给线程池后,线程执行工作时,一直阻塞在 mManualEvent.WaitOne(); 这一句,直到10s后主线程发出了信号,该工作才继续执行后续代码。这是一种“假开始”控制操作,本质上并没有实现让指定工作在希望的时候开始工作。这里 在初始化 ManualResetEvent 对象时参数 false 表示,默认将信号置为“阻塞状态”,通过代码 mManualEvent.Set(); 将信号置为“可继续状态”。反之,可以通过代码 mManualEvent.Reset(); 将线程置为“阻塞状态”。
有时,需要等待所有线程池中的线程执行完成后,才继续执行其它某些代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | AutoResetEvent[] mAutoResetEvent; public void Main()
{
mAutoResetEvent = new AutoResetEvent[]{ new AutoResetEvent(false),
}; for (int i = 0; i < 3; i++)
Thread.Sleep(1000);
ThreadPool.QueueUserWorkItem(JobForAThread, i);
}
Console.WriteLine( "所有工作已经添加到池中..." );
WaitHandle.WaitAll(mAutoResetEvent);
Console.ReadKey();
{int vJobIndex = (int)state;
Console.WriteLine( "Job {0} Started." , vJobIndex); for (int i = 1; i <= 5; i++)
{
Console.WriteLine( "Running Thread {0},Step {1},Job {2} " , Thread.CurrentThread.ManagedThreadId, i, vJobIndex);
Thread.Sleep(500);
}
mAutoResetEvent[vJobIndex].Set();
}
|
运行结果:
[]
以上就是C# 多线程--线程池的详细介绍的详细内容!
返回前面的内容
相关阅读 >>
.net实现后台登录验证
c#连接oracle的实例教程
.net core配置与自动更新的实现方法_实用技巧
入门级的.net mvc 实例
新手学习.net编程计划-1
编写高性能 .net的实例教程
c#编程如何获取电脑硬件信息的方法?
c#如何利用filesystemwatcher控件实现的文件监控的具体示例分享
关于.net 3.5中的委托实例
总结一些编码和设计原则实例
更多相关阅读请进入《csharp》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C# 多线程--线程池的详细介绍