创建新的Thread,传递两个参数

时间:2014-11-13 01:43:47

标签: c# multithreading

我试图创建一个传递两个参数的新线程,我搜索了太多次但仍然没有结果。 这是我的方法:

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);
    }

2 个答案:

答案 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表达式语法在这里声明)。参数xy由匿名方法“捕获”,在线程启动时传递给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作为参数。因此,您必须创建对象并将值作为对象传递到该线程中。