C#线程的两个参数

时间:2012-09-08 16:37:07

标签: c# multithreading

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

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

但我如何将它们发送给线程?

5 个答案:

答案 0 :(得分:3)

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

Thread thread = new Thread(()=>A(5,6));

答案 1 :(得分:2)

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

thread.Start(new object[] { a, b });

答案 2 :(得分: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使用线程是没有意义的。

答案 3 :(得分:1)

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

答案 4 :(得分: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];
        }
    }

注意:新线程调用的方法只能接受对象参数。这个对象里面的内容不是代码的关注,可以是任何东西,比如我的2个整数。 然后,您只需将对象解包为原始数据类型。