Come faccio il ping continuo su una pagina web ?

giovedì 20 agosto 2009 - 15.18

kduhcm Profilo | Junior Member

Ciao Ragazzi,
ho un sito su aruba. Non ho la possibilita' di mettere un daemon perche' non ho il server virtuale ma solo l'hosting. E' possibile in qualche modo far si che si apra una pagina del sito ogni minuto? Questa pagina dovrebbe fare dei controlli ogni minuto. Chiaramente Potrei farlo con un bot, richiamando la pagina ogni minuto, ma dovrei lasciare sempre un pc acceso. C'e' un modo alternativo? Rispondete please... :-)


-----------------------------------------------------------------------------------------------------------------------
Sviluppo siti web Roma www.actasoftware.com

luigidibiasi Profilo | Guru

mai usato hosting aruba (x il momento anche se dovrò lavorarci presto) e quindi la sparo a casaccio... ma il framework installato (v 3.5) è limitato o puoi usare tutte le classi??

in caso positivo non puoi lanciare un thread? (thread + webclient per richiamare la pagina .. tutto in memoria..) (sarebbe chiedere troppo.. credo che iis giri con i privilegi ristretti ... )

Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

kduhcm Profilo | Junior Member

Un thread ? So cosa sono, ma non li ho mai usati, potrebbe essere l'occasione per farci un po di pratica. Praticamente questo thread dovrebbe controllare ogni minuto una cartella. Appena arriva un file nuovo dovrebbe mandare un'email di avviso. Ma il thread non va in timeout dopo x secondi? A me serve che faccia questo controllo ogni minuto per 8 ore consecutive tutti i giorni. E' possibile farlo con i thread?

-----------------------------------------------------------------------------------------------------------------------
Sviluppo siti web Roma www.actasoftware.com

luigidibiasi Profilo | Guru

Non so se aruba ti permette di istanziarli tramite asp.net.. dovresti provare...

Prova a creare un oggetto system.threading.thread all'intero della tua pagina asp su aruba e vedi se ti dà errore...

per info su come istanziarne uno vedi qui :

http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx


>>Ma il thread non va in timeout dopo x secondi?
no. il thread esiste finchè non lo termini o non ha più nulla da fare


poi dopo vediamo come fare il ping ..


Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

kduhcm Profilo | Junior Member

Ok,
ho fatto una pagina che cliccando su un bottone mi starta il thread usando ThreadPool.QueueUserWorkItem (vedi codice sotto e dimmi tu se c'e' un modo migliore di farlo). Praticamente cosi' mi invia un email ogni 15 secondi per 5 volte. A questo punto pero' vorrei anche capire, prima di cliccare sul bottone che mi starta il thread, se c'e' gia un thread attivo, prima di lanciarne un altro e vorrei avere la possibilita' stopparlo se voglio... Come si fa?

protected void btnStartThread_Click(object sender, EventArgs e)
{
if (ThreadPool.QueueUserWorkItem(new WaitCallback(checkNuoveFoto)))
{
lblMessaggio.Text = "Thread startato";
}
else
{
lblMessaggio.Text = "------- Thread KO ------------";
}
}
public static void checkNuoveFoto(Object stateInfo)
{
for (int i = 0; i < 5; i++)
{
inviaEmail();
Thread.Sleep(15000);
}
}

-----------------------------------------------------------------------------------------------------------------------
Sviluppo siti web Roma www.actasoftware.com

luigidibiasi Profilo | Guru

Potresti salvarti un riferimento al thread nell'oggetto application ... (ti scrivo l'idea lo devi implementare )

esempio: (METODO CLICK DEL BUTTON)

' RIF AL THREAD
dim theTh as thread

' RECUPERIAMO DA APPLICATION IL RIFERIMENTO ALL'EVENTUALE THREAD ISTANZIATO
dim theTh = application("theThread")
if isnothing(theTh) then
' avii il thread
theTh = new Thread()
application.add("theThread",theTh) '<-- salvi il thread nell'oggetto application
else
' i lthread è già avviato non fa nulla
end if

>> bloccare, stoppare
vedi i metodi dell'oggetto thread da msdn abort,susped etc..


>> e il metodo migliore?
sicuramente esiste qualche altro metodo per mantere un riferimento al thread senza l'oggetto application ma così su due piedi non me ne vengono altri.. il codice sopra dovrebbe comunque funzionare


Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

kduhcm Profilo | Junior Member

Ok, mi salvo il riferimento in application quando starto il thread. E se il thread per qualche motivo va male (ad esempio viene stoppato dal server per qualche motivo) lo riesco a capire testando il riferimento salvato? Mi va a null il riferimento in questo caso o mi risulta sempre che il thread e' startato?

-----------------------------------------------------------------------------------------------------------------------
Sviluppo siti web Roma www.actasoftware.com

luigidibiasi Profilo | Guru

ti guardi la proprietà State (mi sembra si chiami state) dell'oggetto thread
Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

kduhcm Profilo | Junior Member

Perfetto, funziona...
Thread t1;

t1 = (Thread)Application["rifThread"];

if (t1 != null)
{
if (t1.ThreadState != ThreadState.Stopped)
{
lblMessaggio.Text = "Thread gia startato. Stato attuale: " + t1.ThreadState; ;
return;
}
}
t1 = new Thread(new ThreadStart(checkNuoveFoto));
Application["rifThread"] = t1;
t1.Start();

Un ultima cosa e chiudiamo il post...
C'e' un modo per vedere quali sono i thread in stato running o sleep senza usare il riferimento in application come abbiamo fatto?

-----------------------------------------------------------------------------------------------------------------------
Sviluppo siti web Roma http://www.actasoftware.com

luigidibiasi Profilo | Guru

Così su due piedi non saprei... tra una richiesta http e l'altra i riferimenti agli oggetti li perdi nel caso in cui tu stia implementando il codice direttamente nel file aspx (cioè tra <% %>)...

Tu vuoi lanciare più thread e non vuoi salvarli usando una add x ognuno giusto?

ho visto che stai usando un oggetto threadpool, magari ti mantieni in memoria solo quello che comunque dovrebbe puntare ai thread che lanci... (credo)

>>soluzione spartana...
( ti crei un arraylist a cui aggiungi ogni thread lanciato e mantieni in memoria solo l'arraylist così puoi scorrerlo come e quando ti pare...)

>>application
non vuoi usare questa variabile per qualche motivo oppure la tua e solo curiosità?


mi fermo qui perchè non saprei consigliarti meglio ...


Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/

kduhcm Profilo | Junior Member

Era solo curiosita. Comunque ho abbandonato il threadpool perche' non sapevo come ottenere il riferimento al thread e ho utilizzato l'istruzione Thread t1 = new Thread(), cos' posso salvarmi t1 nell'application. Comunque Grazie sei stato gentilissimo! :-)
-----------------------------------------------------------------------------------------------------------------------
Sviluppo siti web Roma http://www.actasoftware.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5