Передать объект в поток и вернуть его после запуска потока - PullRequest
0 голосов
/ 02 мая 2011

Я скажу это сразу.Я любитель потоков.Я старший c # веб-разработчик , но у меня есть проект, который требует, чтобы я заполнил много объектов, на заполнение которых уходит много времени, поскольку для них требуются ответы WebRequests и для заселения.У меня все работает без threading , но оно не работает достаточно быстро для моих требований.Я хотел бы передать все на ThreadPool, чтобы управлять threading для меня, поскольку я могу поставить в очередь 20 000 потоков одновременно и по понятным причинам.Я не хочу попадать на веб-сайт с запросами, необходимыми для заполнения всех из них одновременно.

Я хотел бы передать объект , заполнить его, а затемдобавьте его в коллекцию в основном потоке после заполнения.Затем, когда все объекты заполнены, продолжайте выполнение программы.Я не знаю, сколько объектов нужно будет заполнить, пока они не будут заполнены.

Мой вопрос ... Как лучше всего это сделать?

Вот цикл, который я пытаюсь ускорить:

foreach (HElement hElement in repeatingTag.RunRepeatingTagInstruction())
{
    object newObject = Activator.CreateInstance(currentObject.GetType().GetGenericArguments()[0]);
    List<XElement> ordering = GetOrdering(tagInstructions.Attribute("type").Value);
    RunOrdering(ordering, newObject, hElement);
    MethodInfo method = currentObject.GetType().GetMethod("Add");
    method.Invoke(currentObject, new[] { newObject });
}

Не знаюЯ не знаю заранее, что это за объект, поэтому я создаю его с помощью Активатора.Метод RunOrdering проходит через инструкции, которые я передаю, которые сообщают ему, как заполнять объект.Затем я добавляю его в коллекцию.Кроме того, сам объект может иметь свойства, которые требуют, чтобы этот метод выполнялся и заполнял их данные.

Ответы [ 3 ]

2 голосов
/ 02 мая 2011

Поскольку вам, вероятно, придется ждать, пока все они будут завершены, все, что вам нужно, - это Parallel.ForEach() или эквивалент. И потокобезопасная коллекция. Обратите внимание, что для интенсивных задач ввода / вывода вы хотели бы ограничить количество потоков. 20,00 темы будут безумны в любой ситуации.

Но нам нужно увидеть больше деталей (код). Обратите внимание, что не существует такой вещи, как «коллекция в главном потоке».

1 голос
/ 02 мая 2011

заполнить много объектов, которые занимают долгое время для заполнения, как они требуют Веб-запросы и ответы

Избегайте потоков, если вы делаете запросы. Нет ускорения после двух потоков, просто существует с двумя. Много толку даром.

0 голосов
/ 02 мая 2011

Пара предложений:

Если вы используете .net 4, попробуйте вместо этого использовать Tasks . Вы бы намного лучше контролировали планирование. Старайтесь не делиться какими-либо объектами, сделайте их неизменными, а также все предупреждения и рекомендации о синхронизации, общих данных и т. Д.

И, во-вторых, вы можете подумать о решении вне процесса, таком как очереди сообщений (продукты xMQ или таблица базы данных бедного человека в качестве очереди), поэтому у вас будет возможность распределить свою задачу по нескольким машинам, если тебе нужно.

...