创建新的线程,传递两个参数
本文关键字:两个 参数 线程 创建 | 更新日期: 2023-09-27 18:30:08
我试图创建一个传递两个参数的新线程,我搜索了太多次,但仍然没有结果。这是我的方法:
public void Add(int smallest, int biggest)
{
for (int i = smallest; i < biggest+1; i++)
{
Thread.Sleep(500);
result = result + i;
}
}
我想做如下:
static void Main()
{
int x=10;
int y=100;
// in this line appear error
Thread t=new Thread(Add);
t.start(x,y);
}
你不能那样做。Thread.Start()
方法不包括支持多个参数的重载。
然而,使用匿名方法作为线程主体可以很容易地解决总体目标:
static void Main()
{
int x=10;
int y=100;
// in this line appear error
Thread t=new Thread(() => Add(x, y));
t.start();
}
也就是说,Add()
方法不是线程入口点,而是将其封装在一个匿名方法中(此处通过lambda表达式语法声明)。参数x
和y
由匿名方法"捕获",在线程启动时传递给Add()
方法。
一个非常重要的注意事项是:只有在实际调用Add()
方法时,才会检索变量中的值。这就是线程启动的时候。如果在此之前修改它们的值,则使用新值。
这个习惯用法适用于任何想要将强类型和/或多个参数传递给方法的上下文,而API通常不允许任何参数或某些固定数字(比如一个)。事件处理程序、Task
入口点、I/O回调等都可以从这种方法中受益。
public class ThreadObj
{
public int smallest {get;set;}
public int biggest {get;set;}
}
public void Add(object obj)
{
ThreadObj myObj = (ThreadObj)obj;
for (int i = myObj.smallest; i < myObj.biggest+1; i++)
{
Thread.Sleep(500);
result = result + i;
}
}
static void Main()
{
Thread t=new Thread(Add);
t.start(new ThreadObj(){ smallest = 10, biggest = 100});
}
线程方法只接受对象作为参数。所以您必须创建对象并将值作为对象传递到该线程中。