`
897371388
  • 浏览: 529083 次
文章分类
社区版块
存档分类
最新评论

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


分享到:
评论

相关推荐

    C#实现向多线程传参的三种方式实例分析

    从《C#高级编程》了解到给线程传递参数有两种方式,一种方式是使用带ParameterizedThreadStart委托参数的Thread构造函数,另一种方式是创建一个自定义类,把线程的方法定义为实例的方法,这样就可以初始化实例的数据...

    c# Thread类的用法详解

    使用带ParameterizedThreadStart委托参数的Thread构造函数: //定义一个数据类型,传递给线程 public struct Data { public string Message; } //创建一个方法,将方法给线程的ParameterizedThreadStart委托 ...

    C#向线程中传递多个参数的解决方法(两种)

    对于多线程编程,很多时候往往需要向线程中传递多个参数,而C#中的线程只接收1个object类型的参数(如下): Thread t = new Thread(new ParameterizedThreadStart(newthread)); t.start(参数); void newthread...

    C#创建线程带参数的方法

    1、无参数线程的创建 Thread thread = new Thread(new ThreadStart(getpic)); thread.Start(); private void showmessage() { Console.WriteLine(hello world); } 2、带一个参数的线程 使用...

    CH11-C#进程与线程.md

    1. 理解进程和线程的基本概念 2. C# Process:进程类 3. C# Thread:线程及与线程有关的类 4. C# ThreadStart:创建无参数无返回的线程 5. ParameterizedThreadStart:创建带参数线程 6. C# Priority:多线程...

    C#多线程之Thread类详解

    使用System.Threading.Thread类可以创建和控制线程。 常用的构造函数有: // 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。 // // 参数: // start: // ...

    C# Thread类最基本使用示例

    通过使用Thread后,一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。使用 ThreadStart 委托或 ParameterizedThreadStart 委托指定由线程执行的程序代码。使用 ParameterizedThreadStart 委托可以...

    c#线程间传递参数详解

    线程操作主要用到Thread类,他是定义在System.Threading.dll下...Thread (ParameterizedThreadStart, Int32) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的最大堆栈大小。 Thr

    c#线程间传递参数

    线程操作主要用到Thread类,他是定义在System.Threading.dll下。...  Thread (ParameterizedThreadStart, Int32) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托,并指定线程的大堆栈大小。

    C#多线程数组模拟socket

    本文实例为大家分享了C#多线程数组模拟socket的具体代码,供大家参考,具体内容如下 代码如下 //实例化线程组 Thread[] clientThreads = new Thread[numThread]; for (int i = 0; i &lt; numThread; i++) { ...

    C#往线程里传递参数的方法小结

    Thread (ParameterizedThreadStart) 初始化 Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。 Thread (ThreadStart) 初始化 Thread 类的新实例。 由 .NET Compact Framework 支持。 Thread ...

    一个多线程断点上传文件的功能

    用多线程实现断点上传的功能 DeleteOverThread(); #region 初始化 string backUploadStatus = dr["BACKEND_UPLOAD_STATUS"].ToString(); //是否上传成功或取消 if (backUploadStatus == Status.Upload_...

    使用ASP.NET创建线程实例教程

    创建新的线程时,需要使用 Thread 类,Thread 类具有接受一个 ThreadStart 委托或 ParameterizedThreadStart 委托的构造函数。该委托包装了调用 Start 方法时由新线程调用的方法。创建了Thread类 的对象之后,线程...

    C#制作简单正则表达式测试器

    C#制作简单正则表达式测试器部分代码: namespace RegexTest { public partial class Rt : Form { public Rt() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } private void btnPi_...

    C#聊天程序

    私聊与多聊、TCP运用 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Net.Sockets; using System...

    c#中实现退出程序后自动重新启动程序的方法

    实例如下: //触发退出程序事件 ... Thread thtmp = new Thread(new ParameterizedThreadStart(run)); object appName = Application.ExecutablePath; Thread.Sleep(1); thtmp.Start(appName); } private voi

    C#解决文件被占用资源,无法删除或修改的方法

     parameterThread_t = new Thread(new ParameterizedThreadStart(this.openThread_telnet));   //parameterThread_t.IsBackground = false;   parameterThread_t.Start(null);  }    ///

    基于typescript实现的计时器

    翻译到C#后 long times = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); long times_now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); new Thread(ParameterizedThreadStart((e) =&gt; { while (true) { ...

    网络协议获取本机登陆QQ账号_访客QQ

    本程序可用,采用Web控件,ParameterizedThreadStart线程,定时,网页协议,通过腾讯登陆网络协议接口获取返回网络页面内容,通过解析指定标签获取相应的内容,如获取QQ号码。本程序只是简单实现抓取当前登陆的qq...

Global site tag (gtag.js) - Google Analytics