Это краткий стартер. Это должно быть улучшено в отношении обработки исключений и т. Д. c. но для вас это должно быть хорошей стартовой площадкой.
// considering this is inside a class ...
const int THREADCOUNT = 4;
private Thread[] threads = new Thread[THREADCOUNT]; // Mind: No Threads created, yet!
private BlockingCollection<string> workQueue =
new BlockingCollection<string>(new ConcurrentQueue<string>());
// ^^ ThreadSafe, blocking FIFO, shared by the threads.
// Attention: This method will (probably) return before processing is finished.
private void Process()
{
for( int i = 0; i < THREADCOUNT; i++ )
{
// create 4 Threads and start them.
threads[i] = new Thread(WorkerMethod);
threads[i].Start( );
}
// Fill work queue => Will be processed while being filled, already!
foreach( var fileToRead in filelist ) // <-- using "filelist" from your example...
workQueue.Add(fileToRead);
// Signal no more items to process.
workQeue.CompleteAdding();
}
// Each Thread will run this:
private void WorkerMethod( )
{
// While queue is not empty or completed
while( !workQueue.IsCompleted )
{
// Queue access is threadsafe: using a ConcurrentQueue behind the scenes.
string filepath = workQueue.Take(); // Get next item. If none, wait for one.
ProcessFile(filepath); // TODO: Implement actual processing of file.
}
// Mind: when the control flow reaches the end of this method,
// the thread will die. You cannot start this instance of the thread
// again.
}
Ум: После того, как Process
был вызван, он не может быть вызван снова . Таким образом, вы должны укрепиться против этого. Только после завершения потоков вы можете запустить очистку и начать заново.
Вы также можете добавить: Аннулирование , Отчет о прогрессе ...
РЕДАКТИРОВАНИЕ
Альтернативой также будет не добавлять каждый отдельный элемент, а предварительно заполнять очередь:
private BlockingCollection<string> workQueue; // leave it like this here ...
// ... in between same as above
// instead of "foreach ..."
workQeue = new BlockingCollection<string>(new ConcurrentQueue<string>( filelist ));
// ^^ Assuming "filelist" is-a IEnumerable<string>
// ... rest same as above
Ссылки: