2011-11-21 11 views
7

Bien, este es el fondo básico. Este programa se conecta a outlook/exchange y analiza a través de todos los mensajes de correo electrónico para ver cuáles están encriptados. Una de las cosas que me gustaría hacer es usar multi-threading para disminuir el tiempo que lleva escanear los mensajes.Cambiar un bucle foreach a un bucle Parallel.ForEach

Actualmente, el código es el siguiente:

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

y me gustaría utilizar la función Parallel.ForEach lugar. Me preguntaba cómo podría configurarlo. Traté de configurar la expresión de cómo es ahora, pero me sale un error que indica que el tipo de objeto se está utilizando como una variable. Cualquier ayuda con esto sería muy apreciada.

Bien, el diseño que me han dado parece ser el correcto. El código es el siguiente en este momento:

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

ahora estoy recibiendo el siguiente error:

Error 15 The type arguments for method System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

¿Alguna idea? Gracias por su ayuda chicos, se lo agradezco.

De acuerdo, encontré este sitio: http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspx y me dio la respuesta que necesitaba para el error. Solo necesitaba cambiar la colección a una genérica haciendo una función de casting.

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

Y luego ajustar el original al

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

Ahora se ejecuta sin errores. Viva.

+2

Por favor, publique su código modificado (el código que le da el mensaje de error). –

+0

Después de la edición: ahora depende de 'folder.Items' y/o' // things ' –

Respuesta

7

Algo como esto:

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

O con ParaCada:

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

Nota: folder.Items se tiene que implementar IEnumerable

+1

+1 por mencionar también el requisito de que se implemente IEnumerable. –

+1

@ericj: que se deduce del 'for (elemento en Items) ...' –

4

Suponiendo que esto es correcto

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

th en él cambia a

Parallel.ForEach (folder.Items, item => Process(item)); 
Cuestiones relacionadas