C# 多线程--线程池的详细介绍


当前第2页 返回上一页

般情况下,“工作”交给线程池后,就不受控制了, 它会由处理器自动决定什么时候开始执行(当然是有空闲线程才行)。可以通过以下代码,让工作在指定时候以后再开始执行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

ManualResetEvent mManualEvent;public void Main()

{

    mManualEvent = new ManualResetEvent(false); // 实例ThreadPool.QueueUserWorkItem(JobForAThread);

 

    Console.WriteLine("{0} 任务已经交给线程池了,但是它没有执行.", DateTime.Now.ToString("HH:mm:ss"));

    Thread.Sleep(10000); // 等待 10smManualEvent.Set();  // 发出信号,让线程继续执行          

    Console.ReadKey(); // 让主线程等待,否则“一闪而过”        }void JobForAThread(object state)

{

    mManualEvent.WaitOne(); // 等待 “ mManualEvent.Set();” 这一句执行(发送信号)Console.WriteLine("{0} 现在开始执行任务啦.", DateTime.Now.ToString("HH:mm:ss"));for (int i = 1; i <= 5; i++)

    {              

        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), // 默认信号为 阻塞new AutoResetEvent(false),new AutoResetEvent(false)

    };for (int i = 0; i < 3; i++) // 创建3个工作            {

        Thread.Sleep(1000);

        ThreadPool.QueueUserWorkItem(JobForAThread, i);

    }

    Console.WriteLine("所有工作已经添加到池中...");

    WaitHandle.WaitAll(mAutoResetEvent); // 等待 mAutoResetEvent 中所有信号变为 继续 后,继续后面代码Console.WriteLine("所有工作已经完成了");

 

    Console.ReadKey(); // 让主线程等待,否则“一闪而过”        }void JobForAThread(object state)

{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》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...