ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#给线程传递数据

2021-08-24 20:02:47  阅读:165  来源: 互联网

标签:Do Thread C# void 类型 参数 传递数据 线程


目录

shanzm-2021年8月24日 19:51:26

0. 前情说明

首先我们都知道,创建一个线程执行一个无参函数,则方式如下:

//期望在线程中执行的函数
static void Do()
{
    Console.WriteLine("Create Thread");
}

//创建线程执行函数
static void Main(string[] ars)
{
    Thread thread=new Thread(Do);
    thread.Start();
    Console.ReadKey();
}



1. ParameterizedThreadStart类型的委托

使用以ParameterizedThreadStart类型的委托为参数的Thread对象构造函数,并使用Thread.Start()来传递参数

这里首先说明一下,上文中示例,创建Thread对象,使用的构造函数的参数是ThreadStart类型的委托

而Thread()方法在.net中有四个重载,我们可以使用其参数类型为ParameterizedThreadStart类型的构造函数,实现线程中执行带参数的函数,即往线程中传递数据。

注意:

  • 是使用Thread.Start(object param)传递参数的

  • ParameterizedThreadStart类型的委托是:参数类型是object类型,无返回值的

  • 因为ParameterizedThreadStart类型的委托的参数类型是object类型,所以我们需要修改期望在新线程中行的方法,将其参数改为object类型,在方法中使用时在进行拆箱

示例:

static void Do(object obj)
{
    int n = (int)obj;
    Console.WriteLine($"方法1:新开线程执行方法,其参数是{n}");
}
static void Main(string[] args)
{
    Thread thread = new Thread(Do);//这里的Do函数就是ParameterizedThreadStart类型的委托
    int n = 999;
    thread.Start(n);//在Start函数中传递参数
}



2. 使用自定义类

将方法封装在类中,则在自定义类实例化的时候,实现传递参数

这里我们依旧是使用Thread对象的参数类型为ThreadStart类型的构造函数,但是我们需要在新线程中执行的有参函数封装在一个类中
在类的实例化时,实现传递参数

示例:

有一个期望在新线程中执行的有参函数如下

pubic void Do(string param)
{
    Console.WriteLine($"新开线程执行方法,其参数是{param}");
}

我们可以这样封装该方法,并在创建线程并执行该方法

public class MyClass
{
    public int param { get; set; }
    public MyClass(int n)
    {
        this.param = n;
    }
    public void Do()
    {
        Console.WriteLine($"方法2:新开线程执行方法,其参数是{param}");
    }
}

static void Main(string[] args)
{
    MyClass myClass=new MyClass(999);
    Thread thread =new Thread(myClass.Do);
}


3. 使用Lambda表达式

使用Lambda表达式调用期望在新线程中执行的函数

示例:

//期望在新线程中执行的方法
static void Do(int n, int m)
{
    Console.WriteLine(n * m);
}

static void Main(string[] args)
{
    Thread thread1 = new Thread(() => Do(2, 3));//定义一个Lambda表达式,调用Do()函数
    thread1.Start();

    //其实这里我们就是可以将所有的函数逻辑直接写在Lambda表达式中,从而更加方便
    Thread thread2 = new Thread(() => { Console.WriteLine(2 * 3); });
    thread2.Start();
}


4. 参考以及文中源代码下载

标签:Do,Thread,C#,void,类型,参数,传递数据,线程
来源: https://www.cnblogs.com/shanzhiming/p/15181943.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有