当前第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# 多线程--线程池的详细介绍的详细内容!
返回前面的内容
相关阅读 >>
c#与.net框架之间的关系是什么?c#程序的开发工具
关于c#视频教程的资源分享
解决visual studio 2017创建.net standard类库编译出错的问题
如何使用c#自定义音乐播放器进度条的实例分析
c#中在构造函数中访问虚成员有什么问题?
分享在c#中时间戳是怎么转换的?
.net添加时间戳防止重放攻击
使用concurrentdictionary多线程同步字典集合实例详解
c#中.net框架的简介
介绍c#中的堆和栈
更多相关阅读请进入《csharp》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » C# 多线程--线程池的详细介绍