Как вывести данные из Threadpool в ConcurrentQueue (C #)? - PullRequest
0 голосов
/ 25 июня 2018

Я написал заявление для своей компании, которое, по сути, отправляет записи из текстового или CSV-файла в массивах по 100 записей в веб-службу, на которую затем возвращает ответ, также в массивах по 100 записей, и записывает их в другую.файл.В настоящее время это однопоточный (последовательная обработка с использованием Backgroundworker в Windows Pro Forms), но я рассчитываю на многопоточность, используя пул потоков и параллельную очередь.

#region NonDataCollectionService
if (!userService.needsAllRecords)
{
    ConcurrentQueue<Record[]> outputQueue = new ConcurrentQueue<Record[]>();
    while ((!inputFile.checkForEnd()) && (!backgroundWorker1.CancellationPending)) 
    {
        //Get array of (typically) 100 records from input file
        Record[] serviceInputRecord = inputFile.getRecords(userService.maxRecsPerRequest);
        //Queue array to be processed by threadpool, send in output concurrentqueue to be filled by threads
        ThreadPool.QueueUserWorkItem(new WaitCallback(sendToService), new object[]{serviceInputRecord, outputQueue});
    }
}
#endregion



void sendToService(Object stateInfo)
{
    //The following block is in progress, I basically need to create copies of my class that calls the service for each thread
    IWS threadService = Activator.CreateInstance(userService.GetType()) as IWS;
    threadService.errorStatus = userService.errorStatus;
    threadService.inputColumns = userService.inputColumns;
    threadService.outputColumns = userService.outputColumns;
    threadService.serviceOptions = userService.serviceOptions;
    threadService.userLicense = userService.userLicense;

    object[] objectArray = stateInfo as object[];

    //Send input records to service
    threadService.sendToService((Record[])objectArray[0]);
    //The line below returns correctly
    Record[] test123 = threadService.outputRecords;
    ConcurrentQueue<Record[]> threadQueue = objectArray[1] as ConcurrentQueue<Record[]>;
    //threadQueue has records here
    threadQueue.Enqueue(test123);
}

Однако, когда я проверяю «outputQueue»в верхнем блоке он пуст, даже когда в threadQueue есть записи в очереди.Это потому, что я передаю по значению, а не по ссылке?Если так, как бы я сделал это синтаксически с Threadpool.QueueUserWorkItem?

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