Как обрабатывать множество текстовых файлов в массиве потоков c# - PullRequest
0 голосов
/ 21 апреля 2020

Есть каталог с некоторыми текстовыми файлами, которые мне нужно каким-то образом обработать. Есть 4 темы. Как обработать эти текстовые файлы в массиве потоков? Есть мысли?

int countfiles; //count of files
    int countthreads = 4;
    Thread[] threads = new Thread[countthreads];
    Queue<string> filesqueue = new Queue<string>();
    foreach (string file_to_read in filelist)
    {
        filesqueue.Enqueue(file_to_read); //добавить в очередь файлы из каталога
        countfiles++;
    }
    for (int i = 0; i < countthreads; i++)
    {
        //how to process text files in array of threads

    }

1 Ответ

1 голос
/ 21 апреля 2020

Это краткий стартер. Это должно быть улучшено в отношении обработки исключений и т. Д. 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

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...