Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [ASP.NET] sessioni e threading

    salve a tutti

    ho il seguente problema

    devo modificare lo stato delle sessioni durante l'esecuzione di un thread per riuscire a capire quando l'esecuzione è terminata e comunicarlo attraverso una "statusPage"

    ho provato con diversi metodi : con il synclock modificando direttamente la variabile sessione ; usando delle property all'interno della classe sempre son il synclock e passando il parametro HttpContext come nell'esempio:

    Dim operation As New ParameterizedThreadStart(AddressOf SpostaArt)
    Dim thrSposta As New Thread(operation)
    thrSposta.Priority = ThreadPriority.Lowest

    thrSposta.Start(HttpContext.Current)

    ' Response.Redirect("TermProcessing.aspx")

    End If

    End Sub

    Sub SpostaArt(ByVal obj As Object)

    Dim context As HttpContext = CType(obj, HttpContext)

    ----------------- esecuzione cicli vari----------------

    SyncLock Session.SyncRoot
    Session("Complete") = True
    End SyncLock
    end sub




    senza alcun risultato, la variabile della sessione non cambia.

    avete qualche soluzione per risolvere questo problema?

    grazie anticipate

  2. #2
    hai provato con
    codice:
    lock(Session)
    {
       Session("...") = true;
    }
    unlock(Session)
    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    le istanze di HttpContext sono strettamente legate all'esecuzione della richiesta corrente, quindi salvarle da qualche parte e riusarle dopo l'evento EndRequest è sbagliato, soprattutto se viene anche fatto da un thread diverso.

    Ti consiglio di crearti un oggetto apposito per dialogare con il thread. Ovvero:

    Dalla pagina:
    1) salvi le info nell'oggetto
    2) salvi l'oggetto nella sessione
    3) avvii il thread passandogli l'oggetto

    Il thread:
    1) fa quel che deve fare
    2) al termine dell'esecuzione aggiorna lo stato dell'oggetto ponendo Terminato=true p.es.

    Nella StatusPage ad ogni accesso controlli lo stato dell'oggetto letto dalla sessione, che è la stessa istanza che il thread aggiorna.

  4. #4
    penso che bitman ti abbia dato la soluzione più giusta e corretta al problema! Lascia perdere il mio prova con
    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  5. #5
    vi ringrazio per la risposta


    @RoBYCoNTe

    lock(Session)
    {
    Session("...") = true;
    }
    unlock(Session)

    praticamente è lo stesso costrutto che ho usato pero in vb.net anzichè in c#.


    @bitman

    2) salvi l'oggetto nella sessione

    il problema è questo , sembra che la sessione non sia modificabile all'interno del thread...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    devi salvarlo dalla pagina che avvia il thread, non dal thread già avviato. Li puoi modificare la sessione come in tutte le pagine aspx.

    Te lo scrivo in C# che vb.net non lo conosco.
    Dentro una pagina aspx:
    codice:
    private class Interscambio
    {
    	public Thread Thread;
    	public bool Completato;
    }
    
    protected override void OnLoad(EventArgs e)
    {
    	base.OnLoad(e);
    	if (Session["job"] != null && ((Interscambio)Session["job"]).Completato == false)
    	{
    		lblResult.Text = "Lavoro ancora in corso, impossibile avviarne un'altro.";
    	}
    	else
    	{
    		Interscambio param = new Interscambio();
    		param.Completato = false;
    		param.Thread = new Thread(new ParameterizedThreadStart(threadProc));
    		Session["job"] = param;
    		lblResult.Text = "Lavoro avviato.";
    	}
    }
    
    private void threadProc(object obj)
    {
    	Interscambio param = (Interscambio)obj;
    	/////
    	Thread.Sleep(10000); // Fa quello che deve fare
    	/////
    	param.Completato = true;
    }

  7. #7
    grazie dell'esempio... lo sto implementando.. ti farò sapere a breve...

  8. #8
    lanciando la pagina di esecuzione asp.net mi ritorna "Impossibile serializzare lo stato sessione. In modalità 'StateServer' o 'SQLServer', ASP.NET serializza gli oggetti dello stato sessione, pertanto gli oggetti non serializzabili o MarshalByRef non sono consentiti. La stessa restrizione si applica se tale serializzazione viene eseguita dallo stato sessione in modalità 'Custom'. "

    ho provato a impostare la classe serializable ma l'errore continua...

    <Serializable()> Friend Class Interscambio

  9. #9
    Scusami se mi intrometto di nuovo ma voglio solo aiutarti, per poter rendere la classe serializzabile devi modificarla in questo modo

    codice:
    [Serializable()]
    private class Interscambio
    {
    	public Thread Thread;
    	public bool Completato;
    }
    Chi sbaglia, apprende meglio di chi non ha mai commesso errori.
    DOT.NET Addicted since 2006 (My Blog)

  10. #10
    [SerializationException: Il tipo 'System.Threading.Thread' nell'assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' non è contrassegnato come serializzabile.]


    forse è per questo? il thread non è serializzabile?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.