Использование лямбда-выражения - действительно самый простой способ.
Однако не использовать аргумент состояния ThreadPool.QueueUserWorkItem для передачи аргументов следует рассматривать как анти-шаблон:
В моем приложении последовательно работает следующее:
var parm = new ParallelInput()
{
threadIdNbr = threadId,
input = input,
inputLength = inputLen,
leftBlock = leftBlock,
leftBlockLength = leftBlockLength,
leftSiblingThreadData = leftSiblingThreadData,
rightSiblingThreadData = rightSiblingThreadData,
threadCommon = threadCommon,
globalOutputWriter = globalOutputWriter,
threadWrittenAllCounter = threadWrittenAllCounter
};
ThreadPool.QueueUserWorkItem(pp => { var p = (ParallelInput)pp; rdr.parallelConvert(p.threadIdNbr, p.input, p.inputLength, p.leftBlock, p.leftBlockLength, p.leftSiblingThreadData, p.rightSiblingThreadData, p.threadCommon, p.globalOutputWriter, p.threadWrittenAllCounter); }, parm);
... и на моем оборудовании последовательно происходит сбой:
ThreadPool.QueueUserWorkItem(_ => rdr.parallelConvert(threadId, input, inputLen, leftBlock, leftBlockLength, leftSiblingThreadData, rightSiblingThreadData, threadCommon, globalOutputWriter, threadWrittenAllCounter), null);
... так как он не может предоставить все данные во входном массиве.
(Протестировано с VS2010 и .NET v4.0.30319)