《C#多线程编程实战(原书第2版)》——3.6 在线程池中使用等待事件处理器及超时

简介:

本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第3章,第3.6节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.6 在线程池中使用等待事件处理器及超时

本节将描述如何在线程池中对操作实现超时,以及如何在线程池中正确地等待。

3.6.1 准备工作

为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在BookSamplesChapter3Recipe5目录中。

3.6.2 实现方式

请执行以下步骤来了解在线程池中实现超时及正确的等待:

1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。

2.在Program.cs文件中加入以下using指令:


2a7b79e7c300f7bff82cfef70fc2541ca1e0e9c7

3.在Main方法下面加入以下代码片段:


d9f45ca5fda3eda75109195df666e920379ffad0


4af518accb819090899c2bc1e4b5995819917249


f161434b571991667fce734db629826a0a92fbe0

4.在Main方法中加入以下代码片段:


653893a08484c0e18c9fddb8f6253741f6f11523

5.运行程序。

3.6.3 工作原理

线程池还有一个有用的方法:ThreadPool.RegisterWaitForSingleObject。该方法允许我们将回调函数放入线程池中的队列中。当提供的等待事件处理器收到信号或发生超时时,该回调函数将被调用。这允许我们为线程池中的操作实现超时功能。

首先注册了处理超时的异步操作。有两种情况会触发该异步操作。第一种情况是接收到了ManualRestEvent对象的信号,当工作者操作成功完成后会发出该信号。第二种情况是在第一个操作完成之前超时。如果超时了,那么会使用CancellationToken来取消第一个操作。

然后我们向线程池中放入一个耗时长的操作。它会运行6秒钟,如果成功完
成则会设置一个ManualResetEvent信号类。在其他情况下,比如需要取消该操作,那么该操作会被丢弃。

最后,为操作提供5秒的超时时间是不够的。这是因为操作会花费6秒来完成,只能取消该操作。所以如果提供7秒的超时时间是可行的,该操作会顺利完成。

3.6.4 更多信息

当有大量的线程必须处于阻塞状态中等待一些多线程事件发信号时,以上方式非常有用。借助于线程池的基础设施,我们无需阻塞所有这样的线程。可以释放这些线程直到信号事件被设置。在服务器端应用程序中这是个非常重要的应用场景,因为服务器端应用程序要求高伸缩性及高性能。

相关文章
|
18天前
|
C#
c# Gridview 点击checkbox 触发的事件
c# Gridview 点击checkbox 触发的事件
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
1月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
1月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
1月前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
29天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
73 0
|
1天前
|
安全 算法 Java
JavaSE&多线程&线程池
JavaSE&多线程&线程池
15 7
|
18天前
|
C#
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
|
27天前
|
Java 测试技术 Python
Python开启线程和线程池的方法
Python开启线程和线程池的方法
17 0
Python开启线程和线程池的方法