通过ParameterizedThreadStart传递参数

lia*_*p47 45 c# multithreading

我正在尝试通过以下方式传递参数:

Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
Run Code Online (Sandbox Code Playgroud)

知道怎么做吗?我很感激一些帮助

Tud*_*dor 96

lazyberezovsky有正确的答案.我想要注意,从技术上讲,由于变量捕获,您可以使用lambda表达式传递任意数量的参数:

var thread = new Thread(
       () => DoMethod(a, b, c));
thread.Start();
Run Code Online (Sandbox Code Playgroud)

这是调用不适合ThreadStartParameterizedThreadStart委托的方法的一种方便方法,但是如果在将父线程中的参数传递给子线程的代码之后更改其中的参数,请注意很容易导致数据争用.

  • @ 2位:因为在使用此方法时,变量是通过引用捕获的,因此父线程中的任何更改都将影响子线程内的值.此外,当lamda实际执行时捕获变量,而不是线程启动时,如果在父级中修改了值,则会为数据争用提供一个小窗口. (8认同)

Ser*_*kiy 37

使用重载Thread.Start方法,它接受对象(如果需要多个参数,可以传递自定义类型或数组):

Foo parameter = // get parameter value
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
thread.Start(parameter);
Run Code Online (Sandbox Code Playgroud)

DoMethod简单地将参数转换为参数类型:

private void DoMethod(object obj)
{
    Foo parameter = (Foo)obj;
    // ...    
}
Run Code Online (Sandbox Code Playgroud)

在.NET 4.0及更高版本中BTW可以使用任务(也要注意竞争条件):

Task.Factory.StartNew(() => DoMethod(a, b, c));
Run Code Online (Sandbox Code Playgroud)