如果我有一個C#線程方法
public void Method(int m)
{
...
}
我怎麼能創建一個線程來這種方法嗎?
Thread t = new Thread((Method));
t.Start(m);
不工作。
如果我有一個C#線程方法
public void Method(int m)
{
...
}
我怎麼能創建一個線程來這種方法嗎?
Thread t = new Thread((Method));
t.Start(m);
不工作。
你調用的方法需要一個參數。因爲它有一個參數和返回類型void你可以使用下面的
ThreadPool.QueueUserWorkItem(o => Method(m));
你不需要使用此方法的int更改爲對象的方法簽名。
使用ThreadPool比手動啓動自己的Thread更有優勢。 Thread vs ThreadPool
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) {.....}
難道你不能通過擺脫'ptsd'來縮短'ParameterizedThreadStart'的例子,只是做'Thread t = new Thread(ThreadParamMethod);'?編譯器是否會自動構造'ParameterizedThreadStart'委託? (我真的沒有嘗試過) – Justin 2011-03-02 19:27:20
方法需要採取的對象不是一個int,以便能夠使用ParameterizedThreadStart委託。
因此,將m改爲一個對象並首先將其轉換爲int。
您可以使用lambda表達式來執行此操作。 C#編譯器會在幕後自動創建ThreadStart
委託。
Thread t = new Thread(() => Method(m));
t.Start();
請注意,如果你改變m
在後面的代碼,更改將傳播到線程,如果它沒有進入Method
呢。如果這是一個問題,你應該複製m
。
究竟發生了什麼?什麼不起作用?您是否收到錯誤消息或方法不起作用?你可以發佈一些額外的代碼? – 2011-03-01 14:44:46
是的我有一個錯誤:無法從方法組轉換爲System.Threading.ParameterizedThreadStart – elisa 2011-03-01 14:46:31