2011-03-01 62 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