在C#构造一个线程时,要向其传递一个函数,这个函数可以试简单的无参函数,也可以是参数为Object类型的函数,但是由于参数类型为Object,因此编译器无法实行类型检查,看下面的例子:
class Program
{
static void Main(string[] args)
{
Program obj = new Program();
ParameterizedThreadStart PTSD = new ParameterizedThreadStart(obj.DisplayNumbers);
Thread t1 = new Thread(PTSD);
t1.Start("Hi");
Console.Read();
}
public void DisplayNumbers(object Max)
{
int Number = Convert.ToInt32(Max);
for (int i = 1; i <= Number; i++)
{
Console.WriteLine("Method1 :" + i);
}
}
}
上面的代码在编译的时候是没有问题的,但是运行会报错,因为字符串无法转为整数:
为此要如何避免这种问题呢?
答案是将传递的参数封装到类中
看具体的例子:
假设我想让多线程执行一个函数DisplayInfo,这个函数有两个参数:
public void DisPlayInfo(string Name,int Age)
{
Console.WriteLine($"\t姓名:{Name}\t\n 年龄:{Age}");
}
我么可以将参数剥离,并和函数放在同一个类中:
public class PassParametersToThread
{
public int Age { get; set; }
public string Name { get; set; }=string.Empty;
public PassParametersToThread(int age,string name)
{
Age = age;
Name = name;
}
public void DisPlayInfo()
{
Console.WriteLine($"\t姓名:{Name}\t\n 年龄:{Age}");
}
}
这样,在执行时,我们向多线程传递的是类PassParameter
PassParametersToThread p = new PassParametersToThread(20, "小红");
Thread t1 = new Thread(p.DisPlayInfo);
t1.Start();
sToThread的成员函数,且没有任何参数。
这样就实现了安全的将参数传递到线程中。
下一篇将介绍如何从线程中获取运算结果