2009-05-13 16 views
6

ho un sito ASP.NET contenente la seguenteasp.net aggiornamento UI utilizzando multi-thread

<asp:UpdatePanel ID="UpdatePanel1" runat="server" > 
    <ContentTemplate> 
      <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>     
    </ContentTemplate>    
</asp:UpdatePanel> 

ho creato una funzione thread. E durante l'esecuzione di questa funzione vorrei aggiornare alcuni controlli sull'interfaccia utente.

protected void Page_Load(object sender, EventArgs e) 
{ 
    new Thread(new ThreadStart(Serialize_Click)).Start(); 
} 
protected void Serialize_Click() 
{ 
    for (int i = 1; i < 10; i++) 
    { 
     Label1.Text = Convert.ToString(i); 
     UpdatePanel1.Update(); 
     System.Threading.Thread.Sleep(1000); 
    } 
} 

Come è possibile aggiornare un controllo Web durante l'esecuzione di un thread? devo forzare "UpdatePanel1" al post-back? Come?

+0

Vieni chiarezza/informazioni aggiuntive sono obbligatori. Quando viene avviato questo thread (una volta per richiesta http, una volta per server, qualcos'altro?) Stai parlando di una richiesta di dati asincroni durante il ciclo di vita della pagina? –

+0

Per favore, vedi la mia risposta, poiché sembra che tu abbia una grossolana incomprensione del ciclo di vita della pagina asp.net e probabilmente http in generale. –

risposta

6

Avrete bisogno di utilizzare un timer sul lato client (o qualche altro metodo) per avere il browser chiedere al server per l'aggiornamento, come questo esempio semplificato:

<asp:UpdatePanel ID="up" runat="server">   
    <ContentTemplate> 
     <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="timer_Ticked" /> 
     <asp:Label ID="Label1" runat="server" Text="1" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Poi, nel tuo codebehind:

protected void timer_Ticked(object sender, EventArgs e) 
{ 
    Label1.Text = (int.Parse(Label1.Text) + 1).ToString(); 
} 

Se si dispone di un processo in background che sta aggiornando un certo stato, vi sia bisogno per memorizzare lo stato condiviso nella sessione, la cache http, o di un database. Si noti che la cache può scadere a causa di molti fattori e che i thread in background possono essere eliminati in caso di riciclo del pool di applicazioni da parte di IIS.

0

Dovresti utilizzare javascript/jquery per eseguire il polling del server per le modifiche. Questo è uno dei più sfortunati effetti collaterali di tutto questo fantasioso jquery/ajax: la gente dimentica che il browser deve interrogare il web server - è una connessione unidirezionale, anche se a volte sembra un'app Winforms client . In definitiva, il browser deve fare una richiesta http/get di propria iniziativa. Sì, è possibile emettere il client javascript prima del tempo per dirgli di farlo, ma ciò richiede che tu sappia esattamente quando richiamare. Sembra che tu abbia un codice arbitrario che verrà eseguito quando è fatto, quindi in questo caso devi continuamente sondare.

-Oisin

1

Questo non farà quello che si pensa che sarà.

Avrebbe più senso usare un timer js sul front-end per chiamare un webmethod che aggiorna la pagina.

Ricordare che al server, una volta che la pagina viene sottoposta a rendering, non esiste più fino a quando non viene richiamata. Il web è un mezzo senza stato. Il postback e il viewstate fanno sembrare che non lo sia, ma lo è davvero.

Come tale, non sarà possibile chiamare il client dal server, che è ciò che si sta tentando di fare.

Problemi correlati