C#使用线程池执行带参数的方法

7
我们有以下的一段代码(灵感来自于这个网站),它将为方法“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。

2个回答

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

只是在思考,是否真的很酷,可以在回调上运行您的方法,同时传递空对象/任务信息。 - electricalbah

0

使用C# 2.0,您可以调用

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

然后在回调函数中,您将对象[]转换回正确的参数和类型。关于返回类型,如果使用线程池,我认为您将无法获取返回值,回调必须具有以下签名:

void Callback (object parm)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接