带参数的ThreadStart

你如何开始在C#中的参数线程?

是的:

Thread t = new Thread (new ParameterizedThreadStart(myMethod)); t.Start (myParameterObject); 

Thread构造函数的两个重载之一是一个ParameterizedThreadStart委托,它允许您将单个parameter passing给start方法。 不幸的是,虽然它只允许一个参数,并且以不安全的方式进行,因为它将它作为对象传递。 我发现使用lambdaexpression式捕获相关参数并以强types的方式传递它们会更容易。

尝试以下

 public Thread StartTheThread(SomeType param1, SomeOtherType param2) { var t = new Thread(() => RealStart(param1, param2)); t.Start(); return t; } private static void RealStart(SomeType param1, SomeOtherType param2) { ... } 

你可以使用lambdaexpression式

 private void MyMethod(string param1,int param2) { //do stuff } Thread myNewThread = new Thread(() => MyMethod("param1",5)); myNewThread.Start(); 

这是迄今为止我能find的最好的答案,它是快速和容易的。

 Thread thread = new Thread(Work); thread.Start(Parameter); private void Work(object param) { string Parameter = (string)param; } 

参数types必须是一个对象。

编辑:

虽然这个答案是不正确的,我build议不要这种做法。 使用lambdaexpression式更容易阅读,不需要types转换。 看到这里: https : //stackoverflow.com/a/1195915/52551

 class Program { static void Main(string[] args) { Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod)); t.Start("My Parameter"); } static void ThreadMethod(object parameter) { // parameter equals to "My Parameter" } } 

简单的方法使用lambda像这样..

 Thread t = new Thread(() => DoSomething("param1", "param2")); t.Start(); 

或者你甚至可以delegate使用ThreadStart像这样…

 ThreadStart ts = delegate { bool moreWork = DoWork("param1", "param2", "param3"); if (moreWork) { DoMoreWork("param1", "param2"); } }; new Thread(ts).Start(); 

使用ParameterizedThreadStart 。

使用ParametrizedThreadStart

我在传递的参数中有问题。 我把for循环中的整数传给了函数并显示出来,但是总是给出不同的结果。 像(1,2,3,2)(1,2,3,3)(1,1,2,3)等与ParametrizedThreadStart委托。

这个简单的代码作为一个魅力

 Thread thread = new Thread(Work); thread.Start(Parameter); private void Work(object param) { string Parameter = (string)param; } 

您可以使用ParametrizedThreadStart委托:

 string parameter = "Hello world!"; Thread t = new Thread(new ParameterizedThreadStart(MyMethod)); t.Start(parameter); 

ParameterizedThreadStart接受一个参数。 您可以使用它来发送一个参数,或者一个包含多个属性的自定义类。

另一种方法是将要作为实例成员启动的方法与要设置的参数的属性一起放入。 创build类的实例,设置属性并启动指定实例和方法的线程,并且方法可以访问属性。

您可以使用BackgroundWorker RunWorkerAsync方法并传入您的值。