Mono High Resolution Timer (unter Linux)
Ich portiere eine Windows C # -Anwendung, die bei 50 ms (für serielle Kommunikation) nach Linux abruft (unter Verwendung von Mono). Wir verwenden derzeit den ZylTimer (von ZylSoft), um "Tick" -Ereignisse in jedem Intervall zu generieren. Da diese Bibliothek jedoch pInvoke-Aufrufe an die Windows-Multimediabibliothek umschließt, können wir dies natürlich nicht verwenden.
//i.e.
timZylComms.Tick += new ZylTimer.TickEventHandler(timZylComms_Tick);
timTimeout.Tick += new ZylTimer.TickEventHandler(timTimeout_Tick);
Also, das führt mich zu der Frage, ob es eine Alternative gibt, die ich unter Mono verwenden kann? Wäre der beste Ansatz, die Klasse "Stoppuhr" (die bei hoher Auflösung zählt) um ein Tick-Ereignis zu erweitern?
Oder gibt es Linux-Bibliotheken, die ich umschließen kann, um diese Funktionalität zu reproduzieren? Oder gibt es eine andere Möglichkeit, dies zu erreichen?
Schätzen Sie alle Gedanken dazu.
BEARBEITEN Würde es Probleme damit geben:
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 ();
}
}