[C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数

在不传递参数情况下,一般大家都使用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; } }


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值