5 messaggi dal 22 aprile 2011
Salve a tutti.
Ho un problema di cui non riesco a venire a capo, riguardante Thread su ASP.NET.
Lo scenario è il seguente: un bottone su una pagina che, una volta premuto, avvia una procedura estremamente lunga. La pagina deve comunque rispondere e non può bloccarsi in attesa della terminazione della procedura, quindi affido la sua esecuzione ad un thread nella maniera più classica
protected void myButtonClick(Object sender, Eventargs e)
{
  Thread myThread = new Thread(new ThreadStart(myVeryLongFunction));
  myThread.Start();
}

Ad un certo punto della mia procedura ho bisogno, sotto una precisa condizione, di ricevere un input dall'utente, ad esempio con un Confirm di Javascript, per procedere.
Ad esempio

//pseudocodice
protected void myVeryLongFunction()
{
  //varie cose
  if (myCondition)
  {
     //chiedi a utente con confirm
     //in base a quello che risponde prosegui o termina
  }
  //altre cose

}

E' una cosa possibile?
Dove posso cercare la risposta?
Esistono workaround o architetture alternative?

Grazie dell'attenzione.
Daniele
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Daniele,


Ad un certo punto della mia procedura ho bisogno, sotto una precisa condizione, di ricevere un input dall'utente, ad esempio con un Confirm di Javascript, per procedere.

Purtroppo non puoi farlo. La connessione con l'utente si interrompe nel momento stesso in cui la pagina aspx viene generata. Inoltre, l'utente nel frattempo può aver già chiuso il browser ed essere uscito di casa :)

Uno scenario come questo non può essere sincrono, ovvero il thread non può mettersi indefinitivamente in attesa che l'utente torni, si ricolleghi al sito e in qualche modo dia la conferma per il proseguimento. Esiste anche un altro problema: se ti si dovesse verificare un'eccezione in quel thread, Asp.Net non potrebbe gestirla. Nel post che ti linko di seguito scrivono addirittura che l'eccezione potrebbe far crashare l'intero processo di asp.net :O ma di questo non sono sicuro, non avendolo mai verificato.
http://improve.dk/archive/2008/04/07/spawning-threads-in-aspnet-can-be-dangerous.aspx

La soluzione al tuo problema potrebbe essere un Workflow. Qui trovi un articolo molto dettagliato sui workflow sequenziali.
http://www.winfxitalia.com/articoli/workflow-foundation/sviluppare-workflow-sequenziali-WF.aspx

Potresti strutturare il tuo workflow in varie attività, una delle quali sarà la richiesta di input da parte dell'utente. Quando l'esecuzione si ferma a questo punto, il workflow viene "ibernato" nel database, almeno finché l'utente non torna nel sito e vede che nella pagina c'è un'attività a cui deve dare approvazione. Fornita l'approvazione, il workflow può essere "riesumato" dal database e ripreso dal punto in cui si era interrotto.

Qui trovi un articolo che ti aiuterà a configurare la persistenza del workflow su Sql Server.
http://www.winfxitalia.com/script/59/Persistere-Workflow-SQL-Server.aspx

Quelli che ti ho postato sono articoli di più di 3 anni fa, ma restano di fatto dell'ottimo materiale introduttivo. Nel frattempo, il motore di workflow è avanzato alla versione 4. Se ti interessa l'argomento, qui trovi altro materiale aggiornato.
http://msdn.microsoft.com/it-it/netframework/dd980559

ciao,
Modificato da BrightSoul il 03 novembre 2011 21.46 -

Enjoy learning and just keep making
5 messaggi dal 22 aprile 2011
Grazie mille della risposta!!! :)

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.