Пауза цикла, пока не вернется внутренняя функция - PullRequest
1 голос
/ 04 октября 2011

У меня есть цикл, который я не хочу продолжать до тех пор, пока не вернется LoadAmazonDataByBatch().Я знаю, что должен быть прямой способ сделать это, и я почти уверен, что подхожу к проблеме неправильно.

const int batchSize = 500;
for (int i = 0; i < total; i = i + batchSize)
{
    LoadAmazonDataByBatch(i, batchSize, fileList, total, amazonLogHandler, stopWatch);
}

LoadAmazonDataByBatch() делает множество вещей в рабочих потоках, включая создание временного набора данных, который станет очень большим без пакетной обработки.Я не хочу создавать новый DataSet до тех пор, пока старый не будет обработан и утилизирован (LoadAmazonDataByBatch).Очевидно, как это написано сейчас, все происходит почти все сразу.

Как мне лучше подойти к этому?

Ответы [ 5 ]

2 голосов
/ 04 октября 2011

Вам необходимо выполнить некоторую синхронизацию потоков.

Непонятно, откуда у вас LoadAmazonByBatch(), но я бы предложил

  • проверить документацию для этой функции, чтобы увидеть, есть ли синхронная версия операции.

  • Если нет документов, то вам нужно будет закатать рукава.Может потребоваться просмотр или изменение источника LoadAmazonByBatch().Ищите ManualResetEvent, установленный рабочими, когда они закончат.Или, может быть, существует обычное событие .NET, которое генерируется этим методом после его завершения.Если эти вещи не существуют, вам нужно добавить что-то подобное.

0 голосов
/ 04 октября 2011

Если LoadAmazonDataByBatch() генерирует дочерние потоки и работает до тех пор, пока не завершится каждый из этих потоков, вы можете использовать метод Thread.Join(), чтобы он дождался завершения дочерних потоков. Я не уверен, как это будет работать для нескольких детей, но я думаю, что все должно быть в порядке.

Ссылка: Threading в C #

0 голосов
/ 04 октября 2011

Если эта функция имеет обратный вызов (stopWatch?), Возможно, вы могли бы вызвать функцию (LoadAmazonDataByBatch) в рамках обратного вызова.

0 голосов
/ 04 октября 2011

Конечно, единственный способ, которым не будет ждать возврата функции, - это если она написана асинхронно?

Соответствующий код - это не цикл, который вы опубликовали, а определение LoadAmazonDataByBatch(), которое нам нужно увидеть.

0 голосов
/ 04 октября 2011

Весьма вероятно, что LoadAmazonDataByBatch создает несколько потоков.Вы должны вызвать Join во всех созданных темах, чтобы дождаться их завершения.

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