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

时间:2010-04-19 23:41:46

标签: 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(delegate()
        {
            Do_SomeWork(Parameter1, Parameter2, Parameter3);
            if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
        }).Start();
    }

    resetEvent.WaitOne();

但是我们想要使用ThreadPool而不是创建我们自己的新线程,这可能对性能有害。问题是我们如何修改上面的代码以使用ThreadPool,记住方法“Do_SomeWork”采用多个参数并且还有一个返回类型(即方法不是空的)。

此外,这是C#2.0。

2 个答案:

答案 0 :(得分:8)

几乎相同的方式,但使用传递给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();

答案 1 :(得分:0)

使用C#2.0,您可以调用

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

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

的签名
  

void Callback (object parm)

相关问题