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

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

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

3.6.1 准备工作

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

3.6.2 实现方式

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

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

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

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

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

5.运行程序。

3.6.3 工作原理

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

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

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

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

3.6.4 更多信息

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

时间: 2025-01-30 00:50:51

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

《C++多线程编程实战》——2.9 在用户空间实现线程

2.9 在用户空间实现线程 既可以在用户空间也可以在内核中实现线程包.具体选择在哪里实现还存在一些争议,在一些实现中可能会混合使用内核线程和用户线程. 我们将讨论在不同地方实现线程包的方法及优缺点.第1种方法是,把整个线程包放进用户空间,内核完全不知道.就内核而言,它管理着普通的单线程进程.这种方法的优点和最显著的优势是,可以在不支持线程的操作系统中实现用户级线程包. 过去,传统的操作系统就采用这种方法,甚至沿用至今.用这种方法,线程可以通过库来实现.所有这些实现都具有相同的通用结构.线程运行在

《深入理解Hadoop(原书第2版)》——3.5Hadoop作业中的第三方函数库

3.5Hadoop作业中的第三方函数库 到目前为止,在Mapper和Reducer类中只使用了标准Java函数库和Hadoop函数库.这些标准函数库包括了Hadoop发行版中的类库和标准Java类库(比如String.class). 可是,仅仅使用这些标准函数库不能够开发复杂的Hadoop作业程序,有时我们需要第三方库的支持.如前所述,Mapper和Reducer类中使用的这些库需要被发送并配置到集群中运行Mapper和Reducer实例的所有节点. 首先,你要编写一个跟介绍过的代码不同的使用第

《C#多线程编程实战(原书第2版)》——导读

前 言 不久前,典型的个人计算机的CPU还只有一个计算核心,并且功耗足以煎熟鸡蛋.2005年,英特尔推出了其首款多核心CPU,从此计算机开始向不同的方向发展.低耗电量及多个计算核心变得比提高行计算(row computing)的核心性能更重要.这也导致了编程范式的改变.现在我们需要学习如何有效地使用所有CPU核心来最优化性能,并同时通过在特定时间只运行需要的程序来节省电池电量.除此之外,我们在编写服务器端应用程序时需要有效地利用多个CPU核心,甚至多台计算机来支持尽可能多的用户. 为了创建这样的

《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介

第3章 使用线程池 在本章中,我们将描述多线程中使用共享资源的常用技术.你将学到以下内容: 在线程池中调用委托 向线程池中放入异步操作 线程池与并行度 实现一个取消选项 在线程池中使用等待事件处理器及超时 使用计时器 使用BackgroundWorker组件 3.1 简介 在之前的章节中我们讨论了创建线程和线程协作的几种方式.现在考虑另一种情况,即只花费极少的时间来完成创建很多异步操作.正如在第1章的简介小节中讨论过的一样,创建线程是昂贵的操作,所以为每个短暂的异步操作创建线程会产生显著的开销.

《C++多线程编程实战》——第2章 进程和线程的概念2.1 简介

第2章 进程和线程的概念 C++多线程编程实战本章介绍以下内容: 进程和线程解释进程模型进程的实现进程间通信(IPC)解决典型的IPC问题线程模型的实现线程的用法在用户空间实现线程在内核实现线程 2.1 简介 现在的计算机能同时处理多件事,许多Windows用户还没有完全意识到这一点.我们举例说明一下.当启动PC系统时,许多进程都在后台启动(例如,管理电子邮件的进程.负责更新病毒库的进程等).通常,用户在执行其他任务时(如,上网),还会打印文件或播放CD.这些活动都需要管理.支持多进程的多任务系

《C#多线程编程实战(原书第2版)》——3.2 在线程池中调用委托

3.2 在线程池中调用委托 本节将展示在线程池中如何异步的执行委托.另外,我们将讨论一个叫做异步编程模型(Asynchronous Programming Model,简称APM)的方式,这是.NET历史中第一个异步编程模式. 3.2.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamples\Chapter3\Recipe1目录中. 3.2.2 实现方式 请执行以下步骤来了解如何在线程池中调用委托: 1.启动Vis

《C#多线程编程实战(原书第2版)》——3.8 使用BackgroundWorker组件

3.8 使用BackgroundWorker组件 本节实例演示了另一种异步编程的方式,即使用BackgroundWorker组件.借助于该对象,可以将异步代码组织为一系列事件及事件处理器.你将学会如何使用该组件进行异步编程. 3.8.1 准备工作 为了学习本节,你需要安装Visual Studio 2015.除此之外无需其他准备.本节的源代码放置在BookSamples\Chapter3\Recipe7目录中. 3.8.2 实现方式 请执行以下步骤来学习如何使用BackgroundWorker组

《JavaScript和jQuery实战手册(原书第3版)》---第1章 编写第一个JavaScript程序 1.1 编程简介

本节书摘来自华章出版社<JavaScript和jQuery实战手册(原书第3版)>一书中的第1章,第1.1节,作者David Sawyer McFarland,姚待艳 李占宣 译,更多章节内容可以访问"华章计算机"公众号查看. 第1章 编写第一个JavaScript程序 HTML自身并没有太多智能:它不能做数学运算,不能判断某人是否正确填写了一个表单,而且不能根据Web访问者的交互来做出判断.基本上,HTML让人们阅读文本.观看图片或视频,并且单击链接转向拥有更多文本.图片

Java多线程编程实战之不提倡的方法

不提倡使用的方法是为支持向后兼容性而保留的那些方法,它们在以后的版本中可能出现,也可能不出现.Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订,stop().suspend() 和 resume() 函数已不提倡使用.这些函数在 JVM 中可能引入微妙的错误.虽然函数名可能听起来很诱人,但请抵制诱惑不要使用它们. 调试线程化的程序 在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁.活锁.内存损坏和资源耗尽. 死锁 死锁可能是多线程程序最常见的问题.当一个线程需要一个资源而