using System.Linq;
using Microsoft.Win32;
class Program
{
static void Main(string[] args)
{
const int dop = 20;
var rootKey = Registry.CurrentUser.OpenSubKey("FooBar");
var result = rootKey.GetSubKeyNames()
.AsParallel()
.WithDegreeOfParallelism(dop)
.Select(subKeyName => DoWork(rootKey.OpenSubKey(subKeyName)))
.ToList(); // вычисляем результат, тут может быть выражение объединения результатов (например Aggregate)
}
static int DoWork(RegistryKey key)
{
// что-то делаем
return key.Name.GetHashCode();
}
}
Многопоточный перебор ключей реестра
Единственное,что приходит в голову—основной поток делает работу по перечислению,а порождённые—собственно анализируют результаты его деятельности.А уж как их порождать(фиксированное число,или базироваться на чём-то) и как хранить данные основного потока,ума не приложу.Прошу совета умных людей
А смысл? Я не думаю что выигрыш в скорости будет.
Не,ну почему же?То мы ищем следующий ключ только после обработки текущего,а то ишем по порядку,параллельно их обрабатывая
а получат ли все потоки доступ к реестру?
Получат,с чего б им не получить-то?:) Монопольщиной там не пахнет,изменения ключей не будет тоже,только чтение
Не будет выигрыша в скорости. ИМХО.
Пришлось всё же работу по перебору возложить на каждый поток,ибо если основной будет формировать строки с именами,то я застрелюсь в обрабатывающих делать синхронизацию по их использованию
(тестовую версию пишу)
C#: PLINQ + TPL
Цитата: hardcase
C#: PLINQ + TPL
> Win32 API
…
(ну т.е. C# точно не нужен)
Цитата: @pixo $oft
> Win32 API
Ты намекаешь на то, что с Win API нельзя работать из C#?
Вполне себе можно. А для работы с реестром есть вполне годное API. Для распараллеливания также есть инструменты, которые я назвал постом ранее: PLINQ для создания алгоритмов с параллелизмом по данным и TPL для параллелизма по задачам.
Цитата: hardcase
Ты намекаешь на то, что с Win API нельзя работать из C#?
Вполне себе можно
Вполне себе можно
Нет,даже не подразумевал.Просто ветка форума про Win32 API,а не про C#
Цитата: hardcase
Для распараллеливания также есть инструменты, которые я назвал постом ранее: PLINQ для создания алгоритмов с параллелизмом по данным и TPL для параллелизма по задачам.
Ага,только оно всё не в том,где я работаю
Цитата: @pixo $oft
Ключи в подключе,один уровень
И много ли там подключей? Я правильно понял что с каждым подключем связана какая-то ресурсоемкая операция?
Цитата: @pixo $oft
Ну тыщ 10,около тогоВполне
Все же я покажу пример параллельной обработки:
Код:
Дисклеймер: это только пример, в промышенном коде необходмы using-и.