2010-04-19 29 views
7

我們有以下一段代碼(在這個網站上發現了這段代碼的想法),它將爲方法「Do_SomeWork()」產生新的線程。這使我們能夠異步運行該方法多次。使用ThreadPool的C#執行方法(帶參數)

的代碼是:

var numThreads = 20; 
    var toProcess = numThreads; 

    var resetEvent = new ManualResetEvent(false); 

    for (var i = 0; i < numThreads; i++) 
    { 
     new Thread(delegate() 
     { 
      Do_SomeWork(Parameter1, Parameter2, Parameter3); 
      if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); 
     }).Start(); 
    } 

    resetEvent.WaitOne(); 

但是我們想利用線程池,而不是創造我們自己的新主題,可以是有害的性能。問題是我們如何修改上面的代碼來使用ThreadPool,記住方法「Do_SomeWork」需要多個參數並且還有一個返回類型(即方法不是void)。

此外,這是C#2.0。

回答

8

簽名幾乎相同的方式,但使用WaitCallback傳遞給ThreadPool.QueueUserWorkItem:

var numThreads = 20; 
var toProcess = numThreads; 

var resetEvent = new ManualResetEvent(false); 

for (var i = 0; i < numThreads; i++) 
{ 
    ThreadPool.QueueUserWorkItem (
     new WaitCallback(delegate(object state) { 
     Do_SomeWork(Parameter1, Parameter2, Parameter3); 
     if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); 
    }), null); 
} 

resetEvent.WaitOne(); 
+0

只是想,如果它真的很酷運行你的回調方法,同時傳遞null對象/ tasksInfo – electricalbah 2014-03-06 05:40:25

1

在C#2.0中,你叫

ThreadPool.QueueUserWorkItem(callback, new object[] { parm1, parm2, etc }); 

然後在回調中你投的對象[]返回到正確的參數和類型。關於返回類型,如果使用線程池,我不認爲你將能夠得到的返回值,則回調必須具有的

void Callback (object parm)