In un'interfaccia interrogata, va bene che un oggetto che rappresenta l'hardware avvii un'attività responsabile del polling?

2

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.

    
posta Snoop 08.03.2016 - 14:37
fonte

1 risposta

4

Non è inaccettabile, ma potrebbe sorprendere il chiamante. Penso che questo possa essere risolto solo nel contesto del sistema nel suo complesso. È questo il thread solo che esegue il polling? Ha i requisiti di tempo? Se ti ritroverai con molti di questi nello stesso sistema, ti conviene avere un thread che li chiama a turno?

In questo caso, preferirei definire un'interfaccia Pollable e avere un singolo thread per tenere traccia degli oggetti Pollable e chiamare i loro metodi Poll ().

    
risposta data 08.03.2016 - 15:53
fonte

Leggi altre domande sui tag