C # Выполнить метод (с параметрами) с ThreadPool - PullRequest
6 голосов
/ 20 апреля 2010

У нас есть следующий фрагмент кода (идея для этого кода была найдена на этом сайте), который создаст новые темы для метода "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 ]

8 голосов
/ 20 апреля 2010

Примерно так же, но используйте 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();
0 голосов
/ 20 апреля 2010

С C # 2.0 вы звоните

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

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

void Callback (object parm)

...