《C#多线程编程实战(原书第2版)》——1.9 向线程传递参数

    xiaoxiao2024-05-07  8

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

    1.9 向线程传递参数

    本节将描述如何提供一段代码来使用要求的数据运行另一个线程。我们将介绍不同的方式来满足此任务,并且回顾常见的错误。

    1.9.1 准备工作

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

    1.9.2 实现方式

    请执行以下步骤来了解如何给一个线程传递参数:

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

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

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

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

    5.运行程序。

    1.9.3 工作原理

    当主程序启动时,首先创建了ThreadSample类的一个对象,并提供了一个迭代次数。然后使用该对象的CountNumbers方法启动线程。该方法运行在另一个线程中,但是使用数字10,该数字是通过ThreadSample对象的构造函数传入的。因此,我们只是使用相同的间接方式将该迭代次数传递给另一个线程。

    1.9.4 更多信息

    另一种传递数据的方式是使用Thread.Start方法。该方法会接收一个对象,并将该对象传递给线程。为了应用该方法,在线程中启动的方法必须接受object类型的单个参数。在创建threadTwo线程时演示了该方式。我们将8作为一个对象传递给了Count方法,然后Count方法被转换为整型。

    接下来的方式是使用lambda表达式。lambda表达式定义了一个不属于任何类的方法。我们创建了一个方法,该方法使用需要的参数调用了另一个方法,并在另一个线程中运行该方法。当启动threadThree线程时,打印出了12个数字,这正是我们通过lambda表达式传递的数字。

    使用lambda表达式引用另一个C#对象的方式被称为闭包。当在lambda表达式中使用任何局部变量时,C#会生成一个类,并将该变量作为该类的一个属性。所以实际上该方式与threadOne线程中使用的一样,但是我们无须定义该类,C#编译器会自动帮我们实现。

    这可能会导致几个问题。例如,如果在多个lambda表达式中使用相同的变量,它们会共享该变量值。在前一个例子中演示了这种情况。当启动threadFour和threadFive线程时,它们都会打印20,因为在这两个线程启动之前变量被修改为20。

    相关资源:C#多线程编程实战.pdf
    最新回复(0)