20 messaggi dal 02 febbraio 2013
Ho un bottone dentro un updatepanel con UpdateMode impostato su conditional

Dentro questo bottone eseguo delle istruzioni che volevo proteggere con un SyncLock , ma questo sembra non funionare.

Per quanto io provi a disabilitare dopo la premuta , se faccio un doppio click rapidissimo esegue due volte l'istruzione.
Come se non gli interessasse niente del SyncLock

Esempio:

Protected Sub ImageButton1_Click(sender As Object, e As ImageClickEventArgs) Handles ImageButton1.Click
SyncLock Me
ImageButton1.enabled = false
cartagiocata = 1
End SyncLock
End Sub

Ho provato anche con una variabile shared dentro una classe
Esempio:
Synlock prova1
.
.
end synlock

Ma niente aiuti?
20 messaggi dal 02 febbraio 2013
Ciao a tutti ,sto provando questo esempio su vb.net studio 2008 per verificare perchè il blocco non mi funziona:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
........Dim blocca As New Object()
........SyncLock blocca
............SyncLock blocca
...............MsgBox("ciao")
............End SyncLock
........End SyncLock
End Sub

Questo è un esempio forzato, siccome facendo un programma più complesso , mi sono reso conto che il blocco non funzionava e ho cercato di riprodurlo volontariamete.
Avete idee? come posso fare ?
Modificato da PaoloMontero il 08 ottobre 2013 15.08 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Paolo,
questo è un problema che dovresti risolvere lato client, disabilitando o nascondendo il bottone col javascript in concomitanza del primo click. Ad esempio:
<asp:Button ID="Button1" OnClick="Button1_Click" OnClientClick="this.style.visibility='hidden';" runat="server" Text="Invia" />


Il SyncLock non impedirà che la richiesta scaturita dal secondo click vada in esecuzione. Semplicemente, farà in modo che non si verifichi contemporaneamente alla prima, ma solo dopo che avrà rilasciato il lock.

ciao,
Moreno

Enjoy learning and just keep making
20 messaggi dal 02 febbraio 2013
Grazie per la tua gentilissima risposta!
Stasera proverò lato client.

Ma la cosa che mi preme capire e come limitare l'accesso alla stessa funzione o sub a più utenti.
Se più utenti premono contemporaneamente lo stesso pulsante c'é il rischio se si hanno delle variabili globali che vengano sovrascritte mentre gli altri utenti modificano pure. Facendo un pasticcio.
Come viene gestita in asp la premuta contemporanea di un pulsante da più utenti ? Io non sto usando thread .
Grazie mille
20 messaggi dal 02 febbraio 2013
<asp:Button ID="Button1" OnClick="Button1_Click" OnClientClick="this.style.visibility='hidden';" runat="server" Text="Invia" />

con questa ho risolto alla grande il problema doppio click!!!

Invece su questo quesito avete suggerimenti:

Ma la cosa che mi preme capire e come limitare l'accesso alla stessa funzione o sub a più utenti.
Se più utenti premono contemporaneamente lo stesso pulsante c'é il rischio se si hanno delle variabili globali che vengano sovrascritte mentre gli altri utenti modificano pure. Facendo un pasticcio.
Come viene gestita in asp la premuta contemporanea di un pulsante da più utenti ? Io non sto usando thread .
Grazie mille
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Paolo,

PaoloMontero ha scritto:

Come viene gestita in asp la premuta contemporanea di un pulsante da più utenti

IIS riceve due richieste e le elabora contemporaneamente con due thread differenti. Dunque può succedere che le tue Sub Button1_Click vadano in esecuzione nello stesso momento.
Questo è un comportamento corretto perché IIS può (e deve) servire le richieste contemporanee di più utenti.
Esiste comunque un limite impostato via configurazione ai thread che IIS può gestire contemporaneamente.

PaoloMontero ha scritto:

c'é il rischio se si hanno delle variabili globali che vengano sovrascritte mentre gli altri utenti modificano pure

Sì, se il tuo codice per esempio va a scrivere su una variabile statica può succedere un disastro. E' possibile che un thread legga quella variabile mentre un altro thread non ha ancora finito a reimpostarla, dando luogo a risultati imprevedibili. Dunque devi proteggerti da questo primo problema di corruzione dei dati usando il SyncLock, oppure una classe come il ReaderWriterLockSlim che distingua tra lock in lettura e in scrittura, ottimizzando così l'accesso alla risorsa. In alternativa puoi ricorrere ad una delle classi thread-safe del namespace System.Collections.Concurrent.
Tu che tipo di variabile globale hai?

Risolto questo problema, se ne pone un altro di più alto livello. Nel frangente che trascorre da quando il form viene presentato all'utente a quando il bottone viene cliccato, possono essersi verificati altri salvataggi da parte di altri utenti. Le informazioni visualizzate nel form potrebbero quindi non essere più rilevanti e perciò l'applicazione non dovrebbe più accettare salvataggi provenienti da una pagina con dati vecchi.
Questo è un problema di concorrenza che si può risolvere in varie maniere, definite pessimistiche o ottimistiche.
Qui trovi un articolo che parla di concorrenza in relazione ad un database, ma puoi comunque trarci delle informazioni utili.
http://technet.microsoft.com/it-it/library/ms189130(v=sql.105).aspx

Descrivi nel dettaglio cosa contengono le tue variabili globali e che ruolo hanno all'interno della tua applicazione.

ciao,
Moreno

Enjoy learning and just keep making
20 messaggi dal 02 febbraio 2013
Grazie per la splendida risposta dettagliata , ti ringrazio del tempo che ci hai perso.
Ho delle variabili globali dentro ad una classe di tipo shared.
Detto ciò io non usando i thread il synclock lo posso usare ?
Ti faccio un esempio di quello che vorrei fare io , se l 'utente 1 clicca un pulsante , subito dopo quasi in contemporanea l 'utente 2 preme lo stesso pulsante, vorrei che l utente 2 fosse servito alla fine dell 'elaborazione del pulsante premuto dall'utente 1
È possibile senza usare i thread ? Posso configurare il server per gestire ad una a una le richieste ? Qualè la soluzione migliore ?
Grazie !
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Paolo,

PaoloMontero ha scritto:

vorrei che l utente 2 fosse servito alla fine dell 'elaborazione del pulsante premuto dall'utente 1


Benissimo, allora puoi usare il SyncLock come stavi già facendo.
Ricordati che un'applicazione web ASP.NET è multi-threaded per default. Il webserver IIS, infatti, può usare vari thread differenti per far fronte alle richieste degli utenti. Quindi, se vuoi leggere/scrivere su variabili Shared devi regolarne l'accesso con il SyncLock.
Come ti dicevo nel post precedente, esistono anche altri sistemi per scrivere su variabili Shared in maniera thread-safe, ma il SyncLock va già bene.

Se questo non risponde al tuo quesito, spiega dettagliatamente cosa inserisci nelle variabili Shared e quale risultato vuoi ottenere.

PaoloMontero ha scritto:

ti ringrazio del tempo che ci hai perso.

Prego :) Non è proprio tempo "perso" se ti ha aiutato a chiarire dei dubbi.

ciao,
Moreno

Enjoy learning and just keep making

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.