创建新的线程,传递两个参数

本文关键字:两个 参数 线程 创建 | 更新日期: 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表达式语法声明)。参数xy由匿名方法"捕获",在线程启动时传递给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});
    }

线程方法只接受对象作为参数。所以您必须创建对象并将值作为对象传递到该线程中。