我试图创建一个传递两个参数的新线程,我搜索了太多次但仍然没有结果。 这是我的方法:
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);
}
答案 0 :(得分:3)
你不能这样做。 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回调等都可以从这种方法中受益。
答案 1 :(得分:0)
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});
}
Thread方法只接受object作为参数。因此,您必须创建对象并将值作为对象传递到该线程中。