将参数传递给线程

时间:2010-05-11 16:52:50

标签: c# multithreading

我想将一个带参数的函数传递给C#中的ThreadStart构造函数。但是,似乎这是不可能的,因为我得到语法错误,我尝试做这样的事情

Thread t1 = new Thread(new ThreadStart(func1(obj1));

其中obj1是List<string>类型的对象(比方说)。

如果我想让一个线程执行这个以对象作为参数的函数,并且我打算用不同的参数值同时创建2个这样的线程,那么实现这个的最佳方法是什么?

9 个答案:

答案 0 :(得分:13)

如果您使用的是.NET 3.5或更高版本,则可以选择使用lambda:

var myThread = new System.Threading.Thread(() => func1(obj1)); 

答案 1 :(得分:8)

您需要ParametrizedThreadStart将参数传递给线程。

Thread t1 = new Thread(new ParametrizedThreadStart(func1);
t1.Start(obj1);

答案 2 :(得分:7)

您可以开始这样的新主题:

Thread thread = new Thread(delegate() {
    // Code here.
});
thread.Start();

anonymous method内,您可以访问创建委托时范围内的变量。

答案 3 :(得分:3)

试试这个:

var bar = 0.0;
Thread t = new Thread(() => 
    {
        Foo(bar);
    });
t.IsBackground = true;
t.Start();

或者在你的情况下:

Object obj1 = new Object();
Thread t = new Thread(() => 
    {
        func1(obj1);
    });
t.IsBackground = true;
t.Start();

答案 4 :(得分:3)

编辑刺客无法使此代码生效,因此我在本文末尾添加了一个完整的示例控制台应用。



{ // some code
  Thread t1 = new Thread(MyThreadStart);
  t1.Start(theList);
}

void MyThreadStart(object state)
{
  List<string> theList = (List<string>)state;
  //..
}


这是我的编辑:下面是一个完整的控制台应用程序 - 该技术确实有效:


using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Threading.Thread t = new System.Threading.Thread(MyThreadStart);
            t.Start("Hello");
            System.Console.ReadLine();
        }


        static void MyThreadStart(object state)
        {
            System.Console.WriteLine((string)state);
        }
    }
}


答案 5 :(得分:3)

这是你正在寻找的效果吗?

        static void Main(string[] args)
    {
        var list = new List<string>(){
            "a","b","c"
        };

        Thread t1 = new Thread(new ParameterizedThreadStart(DoWork));

        t1.Start(list);

        Console.ReadLine();

    }

    public static void DoWork(object stuff)
    {
        foreach (var item in stuff as List<string>)
        {
            Console.WriteLine(item);
        }
    }

答案 6 :(得分:1)

static void func1(object parameter)
{
   // Do stuff here.
}

static void Main(string[] args)
{
  List<string> obj1 = new List<string>();
  Thread t1 = new Thread(func1);
  t1.Start(obj1);
}

它在.Net 2.0中使用名为ParameterizedThreadStart的新委托。你可以阅读它here

答案 7 :(得分:0)

答案 8 :(得分:0)

您是否绝对需要使用Thread对象?或者您只是在寻找多线程处理?更“现代”的方法是使用异步委托:

private delegate void FuncDelegate(object obj1);
.
.
.
FuncDelegate func = func1;
IAsyncResult result = func.BeginInvoke(obj1, Completed, func);

// do other stuff
.
.
.

private void Completed(IAsyncResult result)
{
    ((FuncDelegate)result.AsyncState).EndInvoke(result);

    // do other cleanup
}

更“现代”的方法是在.NET 4 TPL中使用Tasks