《C#多线程编程实战(原书第2版)》——3.3 向线程池中放入异步操作

简介:

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

3.3 向线程池中放入异步操作

本节将描述如何向线程池中放入异步操作。

3.3.1 准备工作

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

3.3.2 实现方式

请执行以下步骤来了解如何向线程池中放入异步操作:

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

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


3cec142571f9ebb932b208235373c786cf48e746

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


67081ea6892a3dae2399032c728baf7f241f0ae2

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


b2ca90a73d0de109e9d89a805d121f0b39f8acf2


d52423960a0e2da5974d2e8273095899409b4a9f

5.运行程序。

3.3.3 工作原理

首先定义了AsyncOperation方法,它接受单个object类型的参数。然后使用QueueUser-WorkItem方法将该方法放到线程池中。接着再次放入该方法,但是这次给方法调用传入了一个state对象。该对象将作为state参数传递给AsynchronousOperation方法。

在操作完成后让线程睡眠一秒钟,从而让线程池拥有为新操作重用线程的可能性。如果注释掉所有的Thread.Sleep调用,那么所有打印出的线程ID多半是不一样的。如果ID是一样的,那很可能是前两个线程被重用来运行接下来的两个操作。

首先将一个lambda表达式放置到线程池中。这里没什么特别的。我们使用了lambda表达式语法,从而无须定义一个单独的方法。

然后,我们使用闭包机制,从而无须传递lambda表达式的状态。闭包更灵活,允许我们向异步操作传递一个以上的对象而且这些对象具有静态类型。所以之前介绍的传递对象给方法回调的机制既冗余又过时。在C#中有了闭包后就不再需要使用它了。

相关文章
|
29天前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
29天前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
29天前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
|
29天前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
|
29天前
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
|
1月前
|
Java
线程池中的空余线程是如何被回收的
线程池中的空余线程是如何被回收的
27 1
|
20天前
|
存储 算法 Java
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
【C/C++ 线程池设计思路】 深入探索线程池设计:任务历史记录的高效管理策略
67 0
|
17天前
|
Java 测试技术 Python
Python开启线程和线程池的方法
Python开启线程和线程池的方法
12 0
Python开启线程和线程池的方法
|
26天前
|
负载均衡 Java 数据处理
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(三)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
50 2
|
26天前
|
存储 监控 Java
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用(二)
【C++ 并发 线程池】轻松掌握C++线程池:从底层原理到高级应用
35 1