0

我可以在线程中发送一个参数

class myThread
{
    Thread thread;
    public myThread(string name, int st)
    {
        thread = new Thread(this.Get_IP);
        thread.Name = name;
        thread.Start(st);//передача параметра в поток
        thread.Join();
    }
    void Get_IP(object st)
    {
        for (int ii = 0; ii < (int)st; ii++)
        {
            // smth
        }
    }
}

但我需要发送其中两个,例如

for (int ii = (int)st; ii < (int)fi; ii++)
{
    // smth
}

有一种方法可以将 2 个参数放在一起

void A(int a, int b) { }

ThreadStart starter = delegate { A(0, 10); };

但是我怎样才能将它们发送到线程?

4

5 回答 5

3

您可以使用 lambda 表达式将更多参数传递给线程。像这样:

Thread thread = new Thread(()=>A(5,6));
于 2012-09-08T16:43:40.720 回答
2

Thread.Start方法接受一个object作为参数。您可以传递一个值数组。

thread.Start(new object[] { a, b });
于 2012-09-08T16:44:09.913 回答
2

将这两个变量作为类中的成员:

class MyThread {

  private Thread _thread;
  private int _start, _finish;

  public MyThread(string name, int start, int finish) {

    _start = start;
    _finish = finish;

    _thread = new Thread(Get_IP);
    _thread.Name = name;
    _thread.Start();
    _thread.Join();
  }

  void Get_IP() {
    for (int ii = _start; ii < _finish; ii++) {
      // smth
    }
  }

}

注意:Join在启动线程后立即调用对于使用线程来说毫无意义。

于 2012-09-08T16:44:33.003 回答
1

创建一个包含您需要传递的所有值的类,并将该类的实例传递给您的线程。

于 2012-09-08T16:42:39.997 回答
1

如果您需要发送 2 个参数,您可以将它们作为您喜欢的任何类型发送,但在启动新线程的方法中,您必须将其拆箱:

    void MyMethod()
    {           
        int a = 1;
        int b = 2;
        int[] data = new[] { a, b };
        Thread t = new Thread(new ParameterizedThreadStart(StartThread));
        t.Start(data);
    }

    private void StartThread(object obj)
    {
        int[] data = obj as int[];
        if (data != null)
        {
            int a = data[0];
            int b = data[1];
        }
    }

注意:new Thread 调用的方法只能接受对象参数。这个对象里面的东西不是代码关心的,可以是任何东西,比如我把 2 个整数框起来。然后,您只需将对象拆箱为您的原始数据类型。

于 2012-09-08T16:46:42.223 回答