Изменение цикла foreach на цикл Parallel.ForEach - PullRequest
7 голосов
/ 21 ноября 2011

Хорошо, вот основной фон.Эта программа подключается к outlook / exchange и анализирует все почтовые сообщения, чтобы увидеть, какие из них зашифрованы.Одна из вещей, которую я хотел бы сделать, - это использовать многопоточность, чтобы уменьшить время, необходимое для сканирования сообщений.

В настоящее время код выглядит следующим образом:

foreach (Object item in folder.Items) {
//Checks for encryption and gets needed info and updates count
}

ИЯ бы хотел использовать функцию Parallel.ForEach.Мне было интересно, как я мог настроить это.Я попытался настроить выражение так, как оно есть сейчас, но я получаю сообщение о том, что тип объекта используется в качестве переменной.Любая помощь с этим будет принята с благодарностью.

Хорошо, макет, который мне дали, кажется правильным.Код выглядит сейчас так:

Parallel.ForEach(folder.Items, item =>
{
//does stuff
});

Теперь я получаю следующую ошибку:

Ошибка 15 Аргументы типа для метода System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action) 'не может быть выведено из использования.Попробуйте явно указать аргументы типа.

Есть идеи?Спасибо за вашу помощь, ребята, это ценится.

Хорошо, я нашел этот сайт: http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspx, и он дал мне ответ, который мне был нужен на ошибку.Мне просто нужно было изменить коллекцию на общую, сделав функцию приведения.

static IEnumerable<object> Cast(IEnumerable source)
{
    foreach (object o in source)
        yield return o;
}

И затем настроить оригинал на

Parallel.ForEach(Cast(folder.Items), item =>
{
//does stuff
});

Теперь он работает без ошибок.Hurray.

Ответы [ 2 ]

8 голосов
/ 21 ноября 2011

Примерно так:

Parallel.For(0, folder.Items.Count - 1, delegate(int i) { 
  object item = folder.Items[i];
});

Или с ForEach:

Parallel.ForEach(folder.Items, item => {whatever you want to do with item})

Примечание: папка. Элементы должны реализовывать IEnumerable

4 голосов
/ 21 ноября 2011

Предполагая, что это правильно

foreach (Object item in folder.Items)
   Process(item);

затем оно меняется на

Parallel.ForEach (folder.Items, item => Process(item));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...