ThreadPool.QueueUserWorkItem è questo esempio un caso d'uso valido?

1

Ho bisogno di inviare una serie di e-mail di promemoria, mai più di 100 e-mail per batch, utilizzando SMTP autenticato. Questo sta accadendo su un WindowsService (senza interfaccia grafica).

La libreria SMTP che stiamo utilizzando genera un evento Inviato . Nel listener di eventi Sent, prendiamo alcune informazioni dal args dell'evento inviato e scriviamo alcuni dati in un database SqlServer tramite la libreria SqlClient, per notare il fatto che la particolare e-mail è stata inviata al destinatario e quando è uscita.

C'è qualche problema o problema per l'eventlistener inviato quando le email vengono inviate su più thread gestiti da ThreadPool?

pseudocodice:

  for each record in batch
     {
       var email = buildEmail(record);
       ThreadPool.QueueUserWorkItem( a =>
            {
               if (!SmtpClient.Connected) SmtpClient.Connect();
               if (!SmtpClient.Authenticated) SmtpClient.Authenticate();
               if (SmtpClient.Authenticated) SmtpClient.Send(email);
            }); 
     }


   SmtpClient.Sent += (sender, args) =>
  {
          //get info from args
          // populate SqlCommand parameters

        ThreadPool.QueueUserWorkItem(b =>
           {
               UpdateDatabase(info);
           });
  };
    
posta TR888 27.01.2016 - 13:23
fonte

1 risposta

1

Dal codice sembra che dovrebbe funzionare. La filatura dei thread in coda nel pool di thread da un listener di eventi non dovrebbe causare problemi (e io uso un pattern simile è parte del mio codice).

Si vorrà sottoporre a test il codice per assicurarsi che attraverso put sia sufficiente tenere il passo e leggere la gestione degli errori nel codice multi-thread ( link per esempio).

Un altro punto dolente che vorrete cercare è l'esaurimento di Connection Pool. Quando accodate i thread in background se avete abbastanza capacità della CPU (o codice UpdateDatabase che usa async per rilasciare il thread mentre state aspettando) potete provare ad aprire più connessioni al database di quante ce ne siano nel pool di connessioni. Quando scrivevo un codice molto simile al tuo, mi sono imbattuto in problemi con questo e ho dovuto eseguire il batch degli aggiornamenti effettivi al database.

    
risposta data 27.01.2016 - 19:03
fonte

Leggi altre domande sui tag