11.886 messaggi dal 09 febbraio 2002
Contributi

L'unica cosa, è rimasto un refuso

Giusto, grazie per la puntualizzazione. Ho corretto il post precedente.


basta un sleep simbolico di 1 millisecondo o cmq qualsiasi altra istruzione bloccante, corretto?

Sicuramente uno sleep di 1 millisecondo allevierebbe il carico sulla CPU ma perché introdurre un polling di questo tipo se sai esattamente quando dovrà avvenire la prossima esecuzione?

C'è un'altra questione qui, di cui tener conto:
skipCount += takeCount;


Dato che il codice che incrementa la variabile skipCount va in esecuzione su un thread separato a causa del Timer, la successiva istruzione addresses.Count > skipCount non è thread-safe e perciò potrebbe produrre risultati inaspettati.
Se si vuole usare un timer, bisognerebbe usare la classe Interlocked per incrementare e leggere il valore intero, dato che due thread insistono su di esso.

Infine a proposito del tempo da attendere...
Pietro aveva scritto:

è possibile spedire solo circa 100 mail per volta, intervallate di mezz'ora.

Mi chiedo se non sia possibile semplicemente attendere 18 secondi tra una mail e l'altra, anziché inviarne 100 nello stesso momento e poi aspettare mezz'ora.
Non so esattamente quale sia il funzionamento di questo particolare server SMTP ma, spesso, impiegano un cooldown che è un valore che si incrementa a ogni email inviata e diminuisce con il passare del tempo. Se è questo il caso, il codice si semplifica un po' perché basterebbe attendere a ogni iterazione:
Queue<string> addresses = GetEmailAddresses();
TimeSpan period = TimeSpan.FromSeconds(18);

while (addresses.Any()) {
  string address = addresses.Dequeue();
  await SendEmail(address);
  await Task.Delay(period);
}


Probabilmente i 18 secondi si possono pure ridurre un po' se teniamo conto del tempo che l'email impiega per essere inviata, ma la terrei facile perché il volume di email da spedire non è eccessivo.

ciao,
Moreno

Enjoy learning and just keep making
3.939 messaggi dal 28 gennaio 2003
Ebbene, rispondo velocemente perchè ho intenzione di studiarmi il vostro interessante codice con molta attenzione (appena sono libero)

Ho fatto una precisa domanda al nostro fornitore che ci ha risposto:
invio max di 250 mail per volta intervallate di 20'

grazie ancora!
Modificato da pietro09 il 05 febbraio 2019 10:06 -
3.939 messaggi dal 28 gennaio 2003
Perdonatemi se faccio una domanda sciocca:

non è più semplice usare il vecchio controllo Timer delle windows form?
11.886 messaggi dal 09 febbraio 2002
Contributi
Dipende dal caso d'uso. L'operazione di invio email deve avviarsi con un'operazione pianificata di Windows oppure deve esserci un utente che la avvia manualmente (e poi magari la monitora, la messe in pausa o la annulla)?

Insomma, quali sono i requisiti di questa applicazione?

Enjoy learning and just keep making
333 messaggi dal 05 novembre 2012
pietro09 ha scritto:
Perdonatemi se faccio una domanda sciocca:

non è più semplice usare il vecchio controllo Timer delle windows form?


Nel post iniziale hai scritto

Vorrei fare qualcosa di semplice, da eseguire nel server, magari di notte.


Partendo da questo requisito, la cosa più semplice è fare una console application (con la soluzione proposta da Moreno) e metterla in esecuzione nello scheduler windows.

Ciao

Alessio
3.939 messaggi dal 28 gennaio 2003
Ebbene, debbo fare questo programma, compilarlo e metterlo nel server.
Poi lo lancio e, a fine giornata controllo il log.

Il vostro codice è un gradino sopra e mi occorre tempo per capirlo, ecco perchè faccio queste domande.

Ciao.


ps.
ad esempio, ho sostituito questa istruzione:

SendEmailAddress(address); con

this.textBox1.AppendText(String.Format("{0}\t{1}\n", n, address) );

e mi va in errore perchè da quel punto non riesco a scrivere sul textbox
333 messaggi dal 05 novembre 2012
Ciao pietro09,

il codice riportato da Moreno (il mio dimenticalo) è più semplice di quanto pensi...prenditi il tempo giusto per capirlo e fai una console application da registrare nel task scheduler di windows.

BrightSoul ha scritto:
oppure deve esserci un utente che la avvia manualmente (e poi magari la monitora, la messe in pausa o la annulla)

Se non hai questa necessita, fare un applicazione windows form non è la scelta più semplice e veloce

a fine giornata controllo il log

Inizialmente va bene, ma in un secondo momento puoi far evolvere la tua console application e fare in modo di spedire una mail di log a fine esecuzione.

Perdona le domande.
Hai mai fatto una console application?
Hai mai utilizzato il task scheduler di windows?

Ciao

Alessio
3.939 messaggi dal 28 gennaio 2003
Sì ma solo a livello elementare. Lavoro maggiormente con le pagine web.

Comunque, accetto i vostri consigli.

Ciao.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.