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;  
    }  
} 

 

相关文章