Sono un ingegnere di hardware / test che sta attualmente scrivendo un'applicazione C # per un dispositivo che non ha meccanismi di evento / interrupt. Per questo motivo sono costretto a eseguire il polling dei registri di controllo interno del dispositivo utilizzando l'API fornita per qualsiasi cambiamento di stato. Mi rendo conto che sarà necessario un thread dedicato per occuparsi del sondaggio.
La domanda concettuale che ho è il seguente schema di progettazione (in cui l'oggetto che rappresenta il pezzo di hardware inizia / termina il suo compito) è una pratica accettabile per quello che sto cercando di fare?
La ragione specifica per cui sto chiedendo questa domanda perché normalmente il controllo generale sarebbe fatto al più alto livello, ma in questo caso devo monitorare una risorsa non gestita e sapere che devo fare è al livello più basso. In alternativa, suppongo che potremmo avere un metodo chiamato Monitor
che sarebbe responsabile di fare ciò che TaskMethod
fa attualmente, e basta fare il Task / Token dall'ambito che istanzia il MyConstructor
.
private readonly CancellationTokenSource myTokenSource = new CancellationTokenSource();
private CancellationToken myToken = CancellationToken.None;
private Task eventLogTask;
// default constructor
public MyConstructor
{
}
// method that starts a task
public void StartTask()
{
// start the event logger
this.eventLogTask = Task.Factory.StartNew(() =>
{
this.TaskMethod();
}, this.myToken, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
// cancel/wait the polling/monitoring event
public void StopTask()
{
this.myTokenSource.Cancel();
this.eventLogTask.Wait();
}
// method performed on the new task
private void TaskMethod()
{
// assign a cancellation token source
this.myToken = myTokenSource.Token;
// start monitoring the event log
while (!this.myToken.IsCancellationRequested)
{
// TODO: control monitoring code
Thread.Sleep(1);
}
}
Nota: il termine registro eventi non ha nulla a che fare con eventi .NET, ma si riferisce invece a qualcosa che si comporta come un registro di un micro-controllore che deve essere interrogato per ottenere lo stato dell'hardware.