Temporizador mono de alta resolución (en Linux)
Estoy portando una aplicación de Windows C # que sondea a 50 ms (para comunicaciones en serie) a Linux (usando Mono). Actualmente estamos usando el ZylTimer (por ZylSoft) para generar eventos de "tick" en cada intervalo, sin embargo, como esta biblioteca envuelve llamadas pInvoke a la biblioteca multimedia de Windows, por supuesto no podemos usar esto.
//i.e.
timZylComms.Tick += new ZylTimer.TickEventHandler(timZylComms_Tick);
timTimeout.Tick += new ZylTimer.TickEventHandler(timTimeout_Tick);
Entonces, ¿esto me lleva a preguntar si existe alguna alternativa que pueda usar con Mono? ¿Sería el mejor enfoque extender la clase "Cronómetro" (que cuenta en alta resolución) con un evento Tick?
¿O hay alguna biblioteca de Linux que pueda envolver para reproducir esta funcionalidad? ¿O hay alguna otra forma de lograr esto?
Agradezco cualquier pensamiento sobre esto.
EDITAR: ¿Habría algún problema con esto?
internal class LinuxHiResTimer{
internal event EventHandler Tick;
private System.Diagnostics.Stopwatch watch;
internal int Interval{ get; set;}
private bool enabled;
internal bool Enabled {
get{ return enabled; }
set {
if (value) {
watch.Start ();
Task.Run (tickGenerator);
enabled = value;
} else {
enabled = value;
}
}
}
private async Task tickGenerator(){
while (enabled){
if (watch.ElapsedMilliseconds > Interval) {
watch.Reset ();
if (Tick != null)
Tick (this, new EventArgs ());
} else {
float fWaitPeriod = (float)(0.8 * (Interval - watch.ElapsedMilliseconds));
if (fWaitPeriod>20)
await Task.Delay(TimeSpan.FromMilliseconds(fWaitPeriod));
}
}
watch.Stop ();
}
internal LinuxHiResTimer(){
watch = new Stopwatch ();
}
~LinuxHiResTimer(){
watch.Stop ();
}
}