C#基础知识回顾--线程传参

在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数,

也不能有返回值。如果希望传递参数给执行函数,则可以使用带参数的ParameterizedThreadStart委托,

public delegate void ParameterizedThreadStart(Object obj)

可以将要传送给线程函数的信息封装为一个对象,然后调用Thread类的以下构造函数

 public Thread (ParameterizedThreadStartstart)

启动线程时,向其传送一个参数信息

Thread t = new Thread(new ParameterizedThreadStart(线程函数));
           t.Start(object nParam);

其中object nParam就是要传递的参数,之所以使用object类型,那是因为nParam可以是任何class类型,这样你就

可传递任何类型给执行函数.

根据参数个数和返回值的不同又分为以下几种情形

一.单参数、无返回值

  这是最简单最直接的情形,无需做其他处理,直接传递

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace ThreadAbort
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("主线程开始");
//创建线程对象
MyThread obj = new MyThread();
Thread th = new Thread(new ParameterizedThreadStart(obj.SomeLongTask));
th.IsBackground = true;
th.Start(10);//启动线程,传递参数10
th.Join();
System.Console.WriteLine("主线程结束");
}
} class MyThread
{
public void SomeLongTask(object obj)
{
int n = Convert.ToInt32(obj); //将接收的参数转换为需要的类型
System.Console.WriteLine("辅助线程开始...");
for (int i = 0; i <= n; i++)
{
System.Console.WriteLine(i);
Thread.Sleep(100);
}
}
}
}

二.多参数、有返回值

需要创建一个参数辅助类用于传递参数和返回值,例如:

class ThreadMethodHelper
    {
          //线程输入参数
          public intx;
          public inty;
          //函数返回值
          public long returnVaule;
    }

然后改造线程函数为ParameterizedThreadStart委托支持的形式

public void SomeFunc(object argu)
   {
          long ret = 0;
          intx = (arguas ThreadMethodHelper).x;
          inty = (arguas ThreadMethodHelper).y;
          //使用x和y完成一些工作,结果保存在ret中
          (arguas ThreadMethodHelper).returnVaule= ret;
    }

最后就可以使用辅助类进行线程操作了

MyThreadobj= new MyThread();
varargu= new ThreadMethodHelper();

//设定线程函数参数
argu.x= 100; argu.y= 200;

//创建线程对象
Thread t = new Thread(new ParameterizedThreadStart(obj.SomeFunc));

//启动线程,向线程传送线程参数
t.Start(argu);

//主线程干其他事……
t.Join();//等待辅助线程结束

Console.WriteLine(argu.returnVaule); //取回线程结果

例1:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace ThreadTest
{
class ThreadMethodHelper
{
//线程输入参数
public int x;
public int y;
//函数返回值
public long returnVaule;
}
class MultiParas
{
public static void SomeTask(object argu)
{
long ret = 0;
int x = (argu as ThreadMethodHelper).x;
int y = (argu as ThreadMethodHelper).y;
//使用x和y完成一些工作,结果保存在ret中
ret = x * y;
(argu as ThreadMethodHelper).returnVaule= ret;
}
static void Main(string[] args)
{
System.Console.WriteLine("主线程开始");
ThreadMethodHelper arg = new ThreadMethodHelper{x = 10, y = 100};
//创建线程对象
Thread th = new Thread(new ParameterizedThreadStart(SomeTask));
//Thread th = new Thread(SomeTask);//这样写也可以
th.IsBackground = true;
th.Start(arg);//启动线程,传递参数10
th.Join();
Console.WriteLine("the result is :" + arg.returnVaule);
System.Console.WriteLine("主线程结束");
}
}
}

例2:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; namespace UseArray
{
class Program
{
static void Main(string[] args)
{
Thread th = new Thread(DoWithArray);
ThreadMethodHelper argu = new ThreadMethodHelper();
argu.arr = new int[] { -1, 9, 100, 78, 23, 54, -90 };
th.Start(argu);
th.Join();
Console.WriteLine("数组元素清单");
foreach (int i in argu.arr)
{
Console.Write(i.ToString() + " ");
}
Console.WriteLine();
Console.WriteLine("最大值:{0}", argu.MaxValue);
Console.WriteLine("最小值:{0}", argu.MinValue);
Console.WriteLine("总和:{0}", argu.Sum );
Console.WriteLine("平均值:{0}", argu.Average ); Console.ReadKey();
} static void DoWithArray(object obj)
{
ThreadMethodHelper argu = obj as ThreadMethodHelper;
for (int i = 0; i < argu.arr.Length; i++)
{
if (argu.arr[i] > argu.MaxValue)
argu.MaxValue = argu.arr[i];
if (argu.arr[i] < argu.MinValue)
argu.MinValue = argu.arr[i];
argu.Sum += argu.arr[i];
}
argu.Average = argu.Sum / argu.arr.Length;
}
} //封装线程的输入和输出信息
class ThreadMethodHelper
{
//线程输入参数
public int[] arr;
//函数返回值
public int MaxValue=0;
public int MinValue=0;
public long Sum=0;
public double Average=0;
}
}
收藏
关注
评论
 
分类: C#

C#基础知识回顾--线程传参的更多相关文章

  1. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  2. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  3. Java基础知识回顾(一):字符串小结

    Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...

  4. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  5. C#基础知识回顾-- 反射(3)

    C#基础知识回顾-- 反射(3)   获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...

  6. C#基础知识回顾-- 反射(1)

    C#基础知识回顾-- 反射(1)   反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...

  7. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  8. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

  9. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

随机推荐

  1. 浏览器扩展系列————异步可插入协议(pluggable protocol)的实现

    原文:浏览器扩展系列----异步可插入协议(pluggable protocol)的实现 IE中有很多我们比较熟悉的协议,如http,https,mailto,ftp等.当然你也可以实现自己定义的协议 ...

  2. C#创建和初始化类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_编辑 ...

  3. linux 在系统启动过程

    从学习<鸟哥linux私人厨房> 用于在计算机系统启动,计算机硬件和软件由(它包含的操作系统软件)包括.对于操作系统在同一台计算机硬件方面的表现,该系统配备有硬件是公用,不同的系统是 的操 ...

  4. HDU 4228 Flooring Tiles 反素数

    推出了结论,万万没想到最后用搜索.. 还想dp来着.. #include <cstdio> #include <cstring> #include <iostream&g ...

  5. 苹果浏览器Safari对JS函数库中newDate()函数中的参数的解析中不支持形如“2020-01-01”形式

    苹果浏览器safari对new Date('1937-01-01')不支持,用.replace(/-/g, "/")函数替换掉中划线即可 如果不做处理,会报错:invalid da ...

  6. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  7. DDD分层架构之值对象(层超类型篇)

    DDD分层架构之值对象(层超类型篇) 上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好 ...

  8. 微软宣布.NET开发环境将开源 支持Mac OS X和Linux

    微软宣布.NET开发环境将开源 支持Mac OS X和Linux 投递人 itwriter 发布于 2014-11-13 06:58 评论(55) 有4388人阅读  原文链接  [收藏]  « » ...

  9. [译]Java垃圾回收是如何工作的

    说明:这篇文章来翻译来自于Javapapers 的How Java Garbage Collection Works 这部分教程是为了理解Java垃圾回收的基础以及它是如何工作的.这是垃圾回收系列教程 ...

  10. 使用hibernate在5秒内插入11万条数据,你觉得可能吗?

    需求是这样的,需要查询某几个表的数据,然后插入到另外一个表. 一看到需求,很多人都会用hibernate去把这些数据都查询出来,然后放到list中, 然后再用for循环之类的进行遍历,一条一条的取出数 ...