Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向线程传递参数_C#_Multithreading - Fatal编程技术网

C# 向线程传递参数

C# 向线程传递参数,c#,multithreading,C#,Multithreading,我想将一个函数传递给C#中的ThreadStart构造函数,该函数接受一个参数。但是,这似乎是不可能的,因为我得到了一个语法错误,所以我尝试这样做 Thread t1 = new Thread(new ThreadStart(func1(obj1)); 其中,obj1是类型为List(例如)的对象 如果我希望一个线程执行此函数,该函数接受一个对象作为参数,并且我计划使用不同的参数值同时创建两个这样的线程,那么实现这一点的最佳方法是什么?如果使用.NET 3.5或更高版本,一个选项是使用lamb

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

Thread t1 = new Thread(new ThreadStart(func1(obj1));
其中,obj1是类型为
List
(例如)的对象


如果我希望一个线程执行此函数,该函数接受一个对象作为参数,并且我计划使用不同的参数值同时创建两个这样的线程,那么实现这一点的最佳方法是什么?

如果使用.NET 3.5或更高版本,一个选项是使用lambda:

var myThread = new System.Threading.Thread(() => func1(obj1)); 
试试这个:

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

您可以像这样启动一个新线程:

Thread thread = new Thread(delegate() {
    // Code here.
});
thread.Start();
在中,您可以访问创建委托时作用域中的变量。

您需要将参数传递给线程

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

编辑刺客很难让这段代码正常工作,所以我在本文末尾提供了一个完整的示例控制台应用程序。



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

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


这就是你想要的效果吗

        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);
        }
    }
static void Main(字符串[]args)
{
var list=新列表(){
“a”、“b”、“c”
};
线程t1=新线程(新的参数化线程启动(DoWork));
t1.启动(列表);
Console.ReadLine();
}
公共静态无效工作(对象填充)
{
foreach(stuff as列表中的var项)
{
控制台写入线(项目);
}
}
静态void func1(对象参数)
{
//在这里做事。
}
静态void Main(字符串[]参数)
{
List obj1=新列表();
线程t1=新线程(func1);
t1.启动(obj1);
}

它在.NET2.0中使用了一个名为ParameterizedThreadStart的新委托。你可以阅读它。

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

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中使用。

您使用的是什么版本的.NET?哇!我以前是这样做的,创建了一个类来包含线程将使用的数据,但我不知道有这么多不同的方法来剥这个动物的皮!这不管用。。我试过了。。。Thomas建议的ParameterizedThreadStart方法有效。@刺客我向你保证,它确实有效。我已经编辑了我的条目,以包含一个控制台应用程序,您可以将其直接粘贴到Visual Studio中并运行。此语法自.Net 2.0以来一直有效,如果将“new Thread(MyThreadStart)”替换为“new Thread(new Delegates)”,非常感谢..此方法有效..但是,在这种情况下,func1的定义必须是void func1(对象状态),不能是void func1(列表obj1)为什么会出现这种情况?这就是
参数化ThreadStart
委托类型的定义方式。您必须将
对象
强制转换回
列表
中的
func1
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);
}
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
}