Millisecondes dans DateTime.Now sur .NET Compact Framework toujours zéro?
je veux avoir un horodatage pour les journaux sur un Windows Mobile projet. La précision doit être de l'ordre d'une centaine de millisecondes au moins.
Cependant mon appel à DateTime.Now
renvoie une DateTime
objet avec le Millisecond
propriété est définie sur zéro. Aussi la Ticks
propriété est arrondi en conséquence.
Comment obtenir une meilleure précision temps?
Rappelez-vous, que mon code s'exécute sur le Compact Framework, version 3.5. J'utilise un HTC touch Pro 2 de l'appareil.
Basé sur la réponse de MusiGenesis j'ai créé la classe suivante qui a résolu ce problème:
///<summary>
///A more precisely implementation of some DateTime properties on mobile devices.
///</summary>
///<devdoc>Tested on a HTC Touch Pro2.</devdoc>
public static class DateTimePrecisely
{
///<summary>
///Remembers the start time when this model was created.
///</summary>
private static DateTime _start = DateTime.Now;
///<summary>
///Remembers the system uptime ticks when this model was created. This
///serves as a more precise time provider as DateTime.Now can do.
///</summary>
private static int _startTick = Environment.TickCount;
///<summary>
///Gets a DateTime object that is set exactly to the current date and time on this computer, expressed as the local time.
///</summary>
///<returns></returns>
public static DateTime Now
{
get
{
return _start.AddMilliseconds(Environment.TickCount - _startTick);
}
}
}
source d'informationauteur Marcel
Vous devez vous connecter pour publier un commentaire.
Environment.TickCount
retourne le nombre de millisecondes que Windows (ou Windows Mobile) a été en cours depuis le dernier redémarrage.À l'utiliser, ajouter un de ces deux variables au niveau de votre code:
Dans votre événement Load du formulaire, le faire:
Chaque fois que vous avez besoin d'un objet DateTime avec millisecondes, ce faire:
Environment.TickCount
est unint
et cette valeur sera "wrap around" pourInt32.MinValue
après 25 jours. Si votre appareil est allons courir longtemps sans avoir à redémarrer, vous aurez envie d'ajouter une case pour unEnvironment.TickCount
valeur qui est inférieur à la dernière valeur lue, et de remettre les deux_start
et_startTick
si.Cet article sur l'obtention d'une milliseconde-temps de résolution pourrait également être utile.
Ce sujet de la Haute Résolution De La Minuterie?
La principale alternative est le Système.Diagnostics.Chronomètre de classe.
Il est disponible en CE mais la note la
IsHighResolution
de la propriété. C'est probablement Faux sur votre appareil, mais le faire vérifier.Il est aussi précis que vous allez obtenir sans P/Invoke.
Régulièrement framework v2.0 vous pouvez utiliser DateTime.Maintenant.ToString("yyyy-MM-dd HH:mm:ss.fff") pour obtenir milisecondes. F signifie plus de précision.