2011-11-21 13 views
7

Ok, quindi ecco lo sfondo di base. Questo programma si connette a Outlook/Exchange e analizza attraverso tutti i messaggi di posta per vedere quali sono criptati. Una delle cose che mi piacerebbe fare è usare il multi-threading per ridurre il tempo necessario per scansionare i messaggi.Modifica di un ciclo foreach su un ciclo Parallel.ForEach

Attualmente il codice simile a questo:

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

e vorrei utilizzare la funzione Parallel.ForEach invece. Mi stavo chiedendo come potrei installarlo. Ho provato a impostare l'espressione su come è ora, ma ricevo un errore che indica che il tipo di oggetto viene utilizzato come variabile. Qualsiasi aiuto con questo sarebbe molto apprezzato.

OK, il layout che ho ricevuto sembra essere corretto. Il codice assomiglia a questo momento:

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

ora sto ottenendo il seguente errore:

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.

Tutte le idee? Grazie per il vostro aiuto ragazzi, è apprezzato.

Ok, ho trovato questo sito: http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspx e mi ha dato la risposta che avevo bisogno dell'errore. Avevo solo bisogno di cambiare la collezione in una generica creando una funzione di casting.

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

E poi modificare il originale per

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

Ora viene eseguito senza errori. Evviva.

+2

Si prega di inviare il codice modificato (il codice che ti dà il messaggio di errore). –

+0

Dopo la modifica: Ora dipende da 'folder.Items' e/o' // fa stuff' –

risposta

7

Qualcosa di simile a questo:

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

O con PerOgni:

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

Nota: folder.Items deve essere attuare IEnumerable

+1

+1 per menzionare anche il requisito che IEnumerable sia implementato. –

+1

@ericj: che segue da 'for (voce in elementi) ...' –

4

Supponendo che questo è corretto

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

th it cambia in

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