Введение в многопоточность - Обработка XML-файла - PullRequest
0 голосов
/ 23 марта 2011

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

У меня есть XML-файл, который является сериализованным List<Stock>.Для каждого из этих элементов товара мне нужно выполнить вызов веб-службы под названием UpdatePrice().

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

Я не прошу полного решения (очевидно), но буду очень признателен за некоторые рекомендации о том, как обычно можно решить эту проблему.

Самая большая проблема, с которой я сталкиваюсь, заключается в том, как определить, какие потоки будут работать с какими объектами.Должен ли я просто взять список, разделить его на число созданных мной потоков и разделить работу?Или мне лучше позволить каждому потоку произвольно выбирать элемент из списка для обработки?(Тогда у меня есть проблемы с блокировкой, но в качестве плюса я могу убедиться, что ни один поток не находится в режиме ожидания)

Как я уже говорил, я не ищу полное решение, а просто некоторые основные рекомендации о том, с чего начать, потому что, честно говоря, я потерянна этот раз и не написано ни одной строки кода.

PS: Кроме того, автоматически сгенерированные прокси веб-службы в .NET threadsafe?

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Нет смысла использовать темы здесь.Поток может предоставить вам только один ресурс: больше циклов ЦП, при условии, что у вас есть ЦП с несколькими ядрами.Это не тот ресурс, который вам нужен для ускорения вашей программы.Вам нужно более быстрое подключение к Интернету.

Если у вас есть пользовательский интерфейс, который вы не хотите заморозить, то уловки BackgroundWorker будут работать просто отлично.

1 голос
/ 23 марта 2011

Я бы предложил поискать решение TPL и PLINQ.Простое примерное решение с использованием Parallel.ForEach() может выглядеть так (параллельные вызовы ограничены 5 в этом примере).

List<Stock> stocks;
Parallel.ForEach(stocks, 
                 new ParallelOptions() { MaxDegreeOfParallelism = 5 }, 
                 (stock) =>
{
    float newPrice = UpdatePrice(stock.TickerSymbol); //web service call
    stock.Price = newPrice;
});
1 голос
/ 23 марта 2011

я бы:

  • Сначала прочитайте все данные XML синхронно.
  • Затем я бы поместил каждый элемент для обработки в одну очередь.
  • Затем вы можете порождать N потоков обработки, в которых в начале каждого из них будет «выталкивать» элемент вашей очереди, оборачивая этот конкретный фрагмент кода в мьютекс / семафор (мьютекс Google C # или параллельный доступ или что-нибудь связанное). Это легко сделать в C # с помощью ключевого слова «lock» для произвольного объекта.

Надеюсь, это поможет. Пьер.

...