Ho un'applicazione per Windows a cui voglio aggiungere la funzionalità TPL. Lo scenario è che ho una classe con un metodo Process
che ha una serie di MailMessage
s passati ad essa, così come la connessione IMAP corrente (usando AE.Net.Mail).Come si usa Task per eseguire molti lavori "Fire and Forget"?
Voglio spin off come tanti fili possibile di un metodo Execute
in un'altra classe che prende un singolo MailMessage
elemento, e il MailMessage
al DB, e poi utilizza la connessione IMAP per eliminare il MailMessage
dal server.
Non mi preoccupo troppo di tenere traccia dei processi - Ho a che fare con un gran numero di e-mail, e non mi preoccupo se ottengo degli errori nella scrittura nel DB o nella cancellazione. Ho solo bisogno dell'applicazione per superare un gran numero di MailMessage il più velocemente possibile.
Ho giocato con Task<MailMessage>.Factory.StartNew
ma non so davvero cosa sto facendo. Non mi sembra di essere in grado di dare il via ... ecco cosa ho provato:
Task test = Task.Factory.StartNew(() =>
{
foreach (var mailMessage in _mms)
{
new ProcessMessage().Execute(mailMessage, imapConn);
}
});
Sono abbastanza sicuro che non avrei dovuto un ciclo nell'espressione Lamda, quando ho eseguito questo lo fa non sembra andare in ProcessMessage.Execute
.
@JasonHiggins Ha suggerito un approccio che può essere facilmente reso più leggibile ed efficiente (utilizzando 'Parallel.ForEach()'). E ha usato un metodo ('ForEach()' invece di 'foreach') che a volte è disapprovato. Quindi, non andrei tanto lontano dicendo che è il prossimo Jon Skeet :-) – svick
L'OP aveva domande specifiche riguardo al TPL ed è per questo che ho deciso di usare questo approccio nella mia risposta. Inoltre, per quanto riguarda foreach vs ForEach, è a mia conoscenza che il metodo di estensione di ForEach è disapprovato nei casi in cui vi sono potenziali effetti collaterali indesiderati e non penso che l'esecuzione di un metodo di annullamento utilizzando il TPL sarebbe un caso negativo da utilizzare questa versione Se ti senti più a tuo agio con il ciclo foreach è certamente facile tradurre questo codice per usarlo. Detto questo, certamente non mi paragonerei a Jon Skeet :) –