c# 线程启动

一、 最常见的就是使用参数为 ThreadStart类型的线程构造函数【线程要执行的函数没有参数】

Thread t = new Thread(new ThreadStart(FunctionName));

可以写成 Thread t = new Thread(FunctionName);   这就是最基本的创建线程方法。但是ThreadStart是无参数的委托类型,这种方法也就不能直接给线程函数传递参数。但是线程函数可以直接访问他所在的类中的其他成员变量,参数可以设置在其他成员变量中,让线程函数去读取。


<span style="font-size:14px;">        using System;
	using System.Collections.Generic;
	using System.Text;
	using System.Threading;
	
	namespace StartThread
	{
	    class Program
	    {
	        int interval = 200;
	        static void Main(string[] args)
	        {
	            Program p = new Program();
	            Thread nonParameterThread = new Thread(new ThreadStart(p.NonParameterRun));
	            nonParameterThread.Start();
	        }
	        /// <summary>
	        /// 不带参数的启动方法
	        /// </summary>
	        public void NonParameterRun()
	        {
	            for (int i = 0; i < 10; i++)
	            {
	                Console.WriteLine("系统当前时间毫秒值:"+DateTime.Now.Millisecond.ToString());
	                Thread.Sleep(interval);//让线程暂停
	            }
	    }
	}</span>


二、 使用参数为 ParameterizedThreadStart类型的线程构造函数【线程要执行的函数拥有参数】

Thread t = new Thread(new ParameterizedThreadStart(FunctionName));

ParameterizedThreadStart也是一个委托类型,其委托的函数必须带一个object类型的参数虽然只带一个object类型参数,但是可以把N个参数都包装进一个类对象,通过这个object参数直接把该对象传给线程,也就相当于传了N个参数,不过多了包装这步。


using System;
	using System.Collections.Generic;
	using System.Text;
	using System.Threading;
	
	namespace StartThread
	{
	    class Program
	    {
	        int interval = 200;
	        static void Main(string[] args)
	        {
	            Program p = new Program();
	
	            Thread parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
	            parameterThread.Name = "Thread A:";
	            parameterThread.Start(30);
	            //启动第二个线程
	            parameterThread = new Thread(new ParameterizedThreadStart(p.ParameterRun));
	            parameterThread.Name = "Thread B:";
	            parameterThread.Start(60);
	        }
	   
	        /// <summary>
	        /// 带参数的启动方法
	        /// </summary>
	        /// <param name="ms">让线程在运行过程中的休眠间隔</param>
	        public void ParameterRun(object ms)
	        {
	            int j = 10;
	            int.TryParse(ms.ToString(), out j);//这里采用了TryParse方法,避免不能转换时出现异常
	            for (int i = 0; i < 10; i++)
	            {
	                Console.WriteLine(Thread.CurrentThread.Name+"系统当前时间毫秒值:" + DateTime.Now.Millisecond.ToString());
	                Thread.Sleep(j);//让线程暂停
	            }
	        }
	    }
	}

对上面的代码做一点说明, 就是线程启动之后,线程的引用不必再存在 ,例如在上面的代码中我用的是同一个引用实例化了两个线程,并且这两个线程运行很正常。

转自:http://blog.csdn.net/zhoufoxcn/article/details/4402999

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值