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

C#使用ThreadPool执行方法(带参数),c#,multithreading,parameters,threadpool,C#,Multithreading,Parameters,Threadpool,我们有以下一段代码(此代码的想法在本网站上找到),它将为“Do_SomeWork()”方法生成新线程。这使我们能够异步多次运行该方法 代码是: var numThreads = 20; var toProcess = numThreads; var resetEvent = new ManualResetEvent(false); for (var i = 0; i < numThreads; i++) { new Thread(

我们有以下一段代码(此代码的想法在本网站上找到),它将为“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();
var numThreads=20;
var toProcess=numThreads;
var resetEvent=新的手动重置事件(false);
对于(var i=0;i
但是,我们希望使用ThreadPool,而不是创建我们自己的新线程,这可能会损害性能。问题是,我们如何修改上述代码以利用ThreadPool,记住方法“Do_SomeWork”包含多个参数,并且还有一个返回类型(即方法不是void)

还有,这是C#2.0。

有了C#2.0,你可以打电话

ThreadPool.QueueUserWorkItem(callback, new object[] { parm1, parm2, etc });
然后在回调中,将对象[]转换回正确的参数和类型。关于返回类型,如果使用ThreadPool,我认为您无法获得返回值,则回调必须具有

void回调(对象参数)


大致相同,但使用传递给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();
var numThreads=20;
var toProcess=numThreads;
var resetEvent=新的手动重置事件(false);
对于(var i=0;i
想想在传递null对象/tasksInfo的同时在回调上运行方法是否真的很酷