Temporizador mono de alta resolução (no Linux)

Estou portando um aplicativo Windows C # que vota em 50ms (para comunicação serial) para Linux (usando Mono). No momento, estamos usando o ZylTimer (da ZylSoft) para gerar eventos "tick" a cada intervalo; no entanto, como essa biblioteca agrupa as chamadas do pInvoke à biblioteca de multimídia do Windows, é claro que não podemos usá-lo.

   //i.e. 
        timZylComms.Tick += new ZylTimer.TickEventHandler(timZylComms_Tick);
        timTimeout.Tick += new ZylTimer.TickEventHandler(timTimeout_Tick);

Então, isso me leva a perguntar se existe uma alternativa que eu possa usar no Mono? A melhor abordagem seria estender a classe "Cronômetro" (que conta em alta resolução) com um evento Tick?

Ou existem bibliotecas linux que eu possa agrupar para reproduzir essa funcionalidade? Ou existe alguma outra maneira de conseguir isso?

Aprecie quaisquer pensamentos sobre isso.

EDITAR: Haveria algum problema com isso:

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 ();
    }
}

questionAnswers(1)

yourAnswerToTheQuestion