本节书摘来自华章出版社《c#多线程编程实战(原书第2版)》一书中的第1章,第1.9节,作者(美)易格恩·阿格佛温(eugene agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
本节将描述如何提供一段代码来使用要求的数据运行另一个线程。我们将介绍不同的方式来满足此任务,并且回顾常见的错误。
为了学习本节,你需要安装visual studio 2015。除此之外无需其他准备。本节的源代码放置在booksampleschapter1recipe8目录中。
请执行以下步骤来了解如何给一个线程传递参数:
1.启动visual studio 2015。新建一个c#控制台应用程序项目。
2.在program.cs文件中加入以下using指令:

3.在main方法下面加入以下代码片段:
4.在main方法中加入以下代码片段:
5.运行程序。
当主程序启动时,首先创建了threadsample类的一个对象,并提供了一个迭代次数。然后使用该对象的countnumbers方法启动线程。该方法运行在另一个线程中,但是使用数字10,该数字是通过threadsample对象的构造函数传入的。因此,我们只是使用相同的间接方式将该迭代次数传递给另一个线程。
另一种传递数据的方式是使用thread.start方法。该方法会接收一个对象,并将该对象传递给线程。为了应用该方法,在线程中启动的方法必须接受object类型的单个参数。在创建threadtwo线程时演示了该方式。我们将8作为一个对象传递给了count方法,然后count方法被转换为整型。
接下来的方式是使用lambda表达式。lambda表达式定义了一个不属于任何类的方法。我们创建了一个方法,该方法使用需要的参数调用了另一个方法,并在另一个线程中运行该方法。当启动threadthree线程时,打印出了12个数字,这正是我们通过lambda表达式传递的数字。
使用lambda表达式引用另一个c#对象的方式被称为闭包。当在lambda表达式中使用任何局部变量时,c#会生成一个类,并将该变量作为该类的一个属性。所以实际上该方式与threadone线程中使用的一样,但是我们无须定义该类,c#编译器会自动帮我们实现。
这可能会导致几个问题。例如,如果在多个lambda表达式中使用相同的变量,它们会共享该变量值。在前一个例子中演示了这种情况。当启动threadfour和threadfive线程时,它们都会打印20,因为在这两个线程启动之前变量被修改为20。