2011-03-01 69 views
16

如果我有一个C#线程方法

public void Method(int m) 
{ 
    ... 
} 

我怎么能创建一个线程来这种方法吗?

Thread t = new Thread((Method));

t.Start(m);

不工作。

+1

究竟发生了什么?什么不起作用?您是否收到错误消息或方法不起作用?你可以发布一些额外的代码? – 2011-03-01 14:44:46

+0

是的我有一个错误:无法从方法组转换为System.Threading.ParameterizedThreadStart – elisa 2011-03-01 14:46:31

回答

13

你调用的方法需要一个参数。因为它有一个参数和返回类型void你可以使用下面的

ThreadPool.QueueUserWorkItem(o => Method(m)); 

你不需要使用此方法的int更改为对象的方法签名。

使用ThreadPool比手动启动自己的Thread更有优势。 Thread vs ThreadPool

+0

我有错误:没有“方法”重载匹配委托“System.Threading.WaitCallback”。请帮助 – elisa 2011-03-01 14:52:17

+0

WaiCallback!= WaitCallback。仔细检查您的拼写。 – 2011-03-01 14:53:49

+0

好的...对不起,错误仍然存​​在。如何解决它的任何想法? – elisa 2011-03-01 14:57:05

0

请尝试:

Thread t = new Thread(new ThreadStart(method)); 
t.Start(); 
+1

我有一个错误,使用您的方法:没有重载方法匹配System.Threading.ThreadStart。 – elisa 2011-03-01 14:47:55

+0

根据问题中提到的问题,代替ThreadStart(),ParameterizedThreadStart()应该用于参数化方法。 – Ambuj 2017-01-04 20:34:58

8
ThreadStart tsd = new ThreadStart(ThreadMethod); 
Thread t = new Thread(tsd); 
t.Start(); 

Thread方法需要与返回类型空隙,不接受参数的方法。

public void ThreadMethod() {.....} 

还有另一种变体,其是ParameterizedThreadStart

ParameterizedThreadStart ptsd = new ParameterizedThreadStart(ThreadParamMethod); 
Thread t = new Thread(ptsd); 
t.Start(yourIntegerValue); 

ThreadParamMethod是返回类型是void和接受型对象的一个​​参数的方法。但是,你可以将任何事物作为对象传递给对象。

public void ThreadParamMethod(object arg) {.....} 
+0

难道你不能通过摆脱'ptsd'来缩短'ParameterizedThreadStart'的例子,只是做'Thread t = new Thread(ThreadParamMethod);'?编译器是否会自动构造'ParameterizedThreadStart'委托? (我真的没有尝试过) – Justin 2011-03-02 19:27:20

2

方法需要采取的对象不是一个int,以便能够使用ParameterizedThreadStart委托。

因此,将m改为一个对象并首先将其转换为int。

26

您可以使用lambda表达式来执行此操作。 C#编译器会在幕后自动创建ThreadStart委托。

Thread t = new Thread(() => Method(m)); 
t.Start(); 

请注意,如果你改变m在后面的代码,更改将传播到线程,如果它没有进入Method呢。如果这是一个问题,你应该复制m

+0

它的工作原理。多谢。贾斯汀,我想问你,如果我使用t.Start它意味着每次我想调用这个方法,我将能够运行代码? – elisa 2011-03-01 15:01:46

+0

@elisa - 不,您需要为每个对“Start”的调用创建一个新线程。每[Thread.Start的文档](http://msdn.microsoft.com/en-us/library/a9fyxz7d.aspx):“一旦线程终止,它不能重新启动另一个调用启动。” – Justin 2011-03-01 15:10:57