且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-07-01 03:53:54

本节书摘来自华章出版社《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指令:


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

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


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

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


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


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

5.运行程序。

3.3.3 工作原理

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

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

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

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