2010-04-19 4 views
7

У нас есть следующий фрагмент кода (идея этого кода была найдена на этом веб-сайте), который породит новые потоки для метода «Do_SomeWork()». Это позволяет нам запускать метод несколько раз асинхронно.Метод выполнения C# (с параметрами) с ThreadPool

Код:

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.

ответ

8

Практически таким же образом, , но использовать 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

Просто думать, если его действительно что здорово запускать ваши методы обратного вызова во время прохождения неопределенных объектов/tasksInfo – electricalbah

1

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

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

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

void Callback (object parm)

Смежные вопросы