使用ParameterizedThreadStart委托向线程函数传送参数
来源:互联网 发布:python pyinotify安装 编辑:程序博客网 时间:2024/05/16 10:49
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("主线程结束");
- }
- }
- }
- 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;
- }
- }
- 使用ParameterizedThreadStart委托向线程函数传送参数
- [转贴]ParameterizedThreadStart,ThreadStart的使用,线程Thread传参数
- 带参数线程的操作(ParameterizedThreadStart,ThreadStart)
- 用ParameterizedThreadStart创建一个带参数的线程
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- C# 线程中使用Timer,并向其触发的事件(函数)中传递参数
- 管理线程之向线程函数传递参数
- 编译错误 : 某函数 的重载均与委托“System.Threading.ParameterizedThreadStart”不匹配
- 从UBOOT向内核驱动传送参数
- C# multithread,threadpool,ParameterizedThreadStart,传递参数给线程以及回调
- 如何向线程函数传递多个参数?
- 如何向线程函数传递多个参数?
- c#怎样利用this.Invoke()方法,用委托调用带参数的方法?new ParameterizedThreadStart()除外
- C#线程委托里带参数
- ParameterizedThreadStart
- windows使用ftp向inux传送文件
- 使用scp向Linux服务器传送文件
- 关于带返回值委托函数和委托函数使用引用参数的问题
- PQ
- 人脸识别算法初次了解
- 开源项目之GIF Animation Control(显示 GIF 动画的 MFC 组件)
- 关于LUA程序设计对象序列化学习笔记
- struts2常见问题总结(持续添加)
- 使用ParameterizedThreadStart委托向线程函数传送参数
- HttpSessionListener的用法
- 控件显示在原有控件上方 c#
- UVaOJ 694 - The Collatz Sequence
- 数学高分指南重点试题
- Java类加载的解析阶段
- mongodb 学习资料-1
- 拥有自制力就拥有重生的力量
- myeclipse 内存 速度 优化 总结 整理