为线程传递参数,在实际应用中,线程需要得到运行时的参数,然后,在执行相关程序任务。如何为线程执行前,将线程方法中需要的数据进行传递呢?本文将介绍该方法。
有两种方式可以为线程传递相关的参数。我们逐一进行介绍。
1.使用带ParameterizedThreadStart委托参数的Thread构造函数
例子:
1.Thread参数调用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadTest
{
class Program
{
static void Main(string[] args)
{
// 使用带ParameterizedThreadStart委托参数的Thread构造函数
Thread t2 = new Thread(ThreadParams);
ThreadParams param= new ThreadParams(1, "Tom");
t2.Start(param);
}
static void ThreadParams(object param)
{
ThreadParams obj = param as ThreadParams;
Console.WriteLine(obj.SID);
Console.WriteLine(obj.SName);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadTest
{
class Program
{
static void Main(string[] args)
{
// 使用带ParameterizedThreadStart委托参数的Thread构造函数
Thread t2 = new Thread(ThreadParams);
ThreadParams param= new ThreadParams(1, "Tom");
t2.Start(param);
}
static void ThreadParams(object param)
{
ThreadParams obj = param as ThreadParams;
Console.WriteLine(obj.SID);
Console.WriteLine(obj.SName);
}
}
}
现在,ThreadParams 类为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ThreadTest
{
/// <summary>
/// 线程要传递的参数
/// </summary>
public class ThreadParams
{
public ThreadParams(int sId, string sName)
{
SID = sId;
SName = sName;
}
public int SID { get; set; }
public string SName { get;set;}
}
}
首先,Thread类中的构造函数:public Thread(ParameterizedThreadStart start);该构造函数的ParameterizedThreadStart 为一个委托类型。
ParameterizedThreadStart委托的方法签名为:public delegate void ParameterizedThreadStart(object obj);所以要声明符合该签名的方法。
static void ThreadParams(object param);
t2.Start(param);启动线程,并且将参数(param)传递给方法ThreadParams(object param)。这样在static void ThreadParams(object param)方法中就可以使用所传递的方法。
2.定义一个类,在其中定义需要的数据,将线程的主方法定义为类的实例方法。
先看代码:
1.参数类,指定了线程需要的参数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ThreadTest
{
/// <summary>
/// 学生类
/// </summary>
public class Students
{
private int _sId;
private string _sName;
public int SId
{
get { return _sId; }
set { _sId = value; }
}
public string SName
{
get { return _sName; }
set { _sName = value; }
}
public Students(int sId, string sName)
{
this._sId = sId;
this._sName = sName;
}
public void ShowInfo()
{
Console.WriteLine(_sId);
Console.WriteLine(_sName);
}
}
}
2.实例化Students类的实例方法,并且将线程开始执行的方法定义为实例方法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ThreadTest
{
class Program
{
static void Main(string[] args)
{
// 给线程传递参数 2.定义一个类,在其中定义需要的数据,将线程的主方法定义为类的实例方法。
Students stu = new Students(2, "Jim");
Thread t3 = new Thread(stu.ShowInfo);
t3.Start();
Console.ReadLine();
}
}
}
注意:该方式应该先实例化类,然后在启动线程。