C# Execute метод (с параметрами) с 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, а не создавать наши собственные новые потоки, которые могут нанести ущерб производительности. Вопрос в том, как мы можем изменить приведенный выше код, чтобы использовать пул потоков с учетом что метод "Do_SomeWork" принимает несколько параметров, а также имеет тип возврата (т. е. метод не является void).

кроме того, это C# 2.0.

2 ответов


почти так же, но используйте 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();

С C# 2.0, вы называете

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

затем внутри обратного вызова вы отбрасываете объект[] обратно в правильные параметры и типы. Что касается типа возврата, если вы используете ThreadPool, я не думаю, что вы сможете получить возвращаемое значение, обратный вызов должен иметь подпись

void Callback (object parm)