Моно таймер высокого разрешения (в Linux)
Я портирую приложение Windows C #, которое опрашивает на 50 мс (для последовательной связи) на Linux (используя Mono). В настоящее время мы используем ZylTimer (от ZylSoft) для генерации тиковых событий в каждом интервале, однако, поскольку эта библиотека оборачивает вызовы pInvoke в библиотеку мультимедиа Windows, мы, конечно, не можем использовать это.
//i.e.
timZylComms.Tick += new ZylTimer.TickEventHandler(timZylComms_Tick);
timTimeout.Tick += new ZylTimer.TickEventHandler(timTimeout_Tick);
Итак, это заставляет меня спросить, есть ли альтернатива, которую я могу использовать под Mono? Будет ли лучший подход к расширению класса «Секундомер» (который считается с высоким разрешением) с событием Tick?
Или есть какие-нибудь библиотеки linux, которые я могу обернуть, чтобы воспроизвести эту функциональность? Или есть какой-то другой способ добиться этого?
Ценю любые мысли по этому поводу.
РЕДАКТИРОВАТЬ: Будут ли какие-либо проблемы с этим:
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 ();
}
}