C#使用ThreadPool执行方法(带参数)

我们有以下代码(在本网站上找到此代码的想法),它将为方法“Do_SomeWork()”生成新线程。 这使我们能够异步多次运行该方法。

代码是:

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而不是创建我们自己的新线程,这可能对性能有害。 问题是如何修改上面的代码以使用ThreadPool,记住方法“Do_SomeWork”采用多个参数并且还具有返回类型(即方法不是void)。

此外,这是C#2.0。

几乎相同的方式,但使用传递给ThreadPool.QueueUserWorkItem的WaitCallback:

 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(); 

使用C#2.0,您可以打电话

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

然后在回调中将对象[]转换回正确的参数和类型。 关于返回类型,如果使用ThreadPool,我认为你不能获得返回值,回调必须有一个签名

void Callback (object parm)