961 messaggi dal 29 aprile 2002
Ciao, DateTime.Now restituisce data e ora del client, quindi un dato che non è assolutamente attendibile per determinate operazioni.
Ad esempio uno dei miei casi è la gestione della visibilità di un controllo Border basata sulla comparazione di due date, una proveniente dal database (Datacontext) e una è l'attuale. Quella attuale non è attendibile perchè proviene appunto dal client e potrebbe essere sbagliata.

Sembra che non sia possibile recuperare l'ora attuale del server da silverlight, o almeno l'unico metodo possibile è quello di una chiamata ad un servizio. Il problema è la natura asincrona delle chiamate ai servizi web, ma non solo, anche se fosse possibile fare chiamate sincrone, immaginate che strazio sarebbe per il server ed anche per il client visualizzare 500 righe di un datagrid nelle quali è presente una colonna templatizzata che contiene un border la cui visibilità è gestita da un converter nel quale faccio la comparazione delle date che vi dicevo prima. 500 righe = 500 chiamate asincrone per recuperare una data precisa al millesimo di secondo per ogni riga.

Che suggerimenti vi sentite di darimi ?
Beh non puoi pretendere di essere preciso al millesimo dato che se ottieni una data dal server, questa per definizione è già vecchia.
Inoltre, la chiamata asincrona o sincrona non determina la precisione, poiché il tempo di latenza del web c'è comunque. Cambia solo che non blocchi l'interfaccia.
Prima di tutto io non farei 100 richieste per 100 righe. Ne basta una sola quando parte l'applicazione. Sfrutterei poi la proprietà Environment.TickCount. Ti dà una precisione al tick in base al tempo del client, ma il suo intervallo è preciso. Farei quindi che al momento della richiesta ti segni i tick attuali interrogando la proprietà. Una volta ottenuto la rispota rileggi la proprietà e sai quanto ci ha messo. Non puoi conoscere l'ora esatta ma imputare il tempo impiegato per metà alla chiamata può essere un buon compromesso, perciò puoi avere l'ora attuale mediante il calcolo
ora = dataRicevuta.AddTicks((endTick - startTick) / -2)

Da questo momento in poi la differenza tra DateTime.Now e l'ora ricevuta rappresenta quanto è "sballato" l'orario dell'utente. Ti basta quindi leggere ogni volta DateTime.Now e togliegli la differenza.

Ciao

Il mio blog
Homepage
961 messaggi dal 29 aprile 2002
Parlavo di precisione al millesimo per enfatizzare la necessità di lavorare con un oggetto datetime corretto. Davvero non necessito di conoscere la data al millesimo di secondo ;). Piuttosto mi interessa conoscere una data ed un ora reali. Quando dici "Ne basta una sola quando parte l'applicazione" riferendoti al recupero della data e dell'ora del server tramite ws, penso alla mia applicazione. Infatti in molte parti del codice ho bisogno di conoscere la data e l'ora del server e sarebbe molto fastidioso fare una chiamata al metodo del web service che restituisce un oggetto datetime prima di fare una chiamata al metodo che ad esempio restituisce uan lista di oggetti del dominio.

Pensandoci bene il tuo suggerimento credo sia adatto anche ad evitarmi questa noiosissima ulteriore chiamata.
In pratica, per ricapitolare, all'app_startup recupero l'ora del server che memorizzo in una proprietà e memorizzo in un'altra proprietà il valore di Environment.TickCount. Ogni volta, in qualsiasi parte del codice e in qualsiasi momento di vita dell'applicazione, che mi serve conoscere la data del server evito di fare una chiamata al servizio e recupero la data memorizzata nella proprietà datetime all'application startup facendo il calcolo che mi hai suggerito tu: .AddTicks((endTick - startTick) / -2)

Praticamente una cosa del genere:

public static DateTime GetRealDate
        {
            get
            {
                return InitServerDate.AddTicks((Environment.TickCount - InitTickCount) / -2);
            }
        }


Ho capito bene?
Thanx
Modificato da dops il 23 febbraio 2010 23.19 -

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.