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)