votar usa unidos requisitos registro registrarse registertovote quien puedo puede poder para las estados elecciones donde cómo como california c# multithreading task hardware polling

c# - usa - requisitos para poder votar en las elecciones



¿Votar de la manera correcta? (3)

Soy un ingeniero de software / hardware con bastante experiencia en tecnologías C y embebidas. Actualmente estoy ocupado escribiendo algunas aplicaciones en C # (.NET) que usa hardware para la adquisición de datos. Ahora lo siguiente, para mi ardiente, pregunta:

Por ejemplo: tengo una máquina que tiene un interruptor de fin para detectar la posición final de un eje. Ahora estoy usando un módulo de adquisición de datos USB para leer los datos. Actualmente estoy usando un subproceso para leer continuamente el estado del puerto.

No hay funcionalidad de interrupción en este dispositivo.

Mi pregunta: ¿Es este el camino correcto? ¿Debo usar temporizadores, hilos o tareas? Sé que las encuestas son algo que la mayoría de ustedes "odian", ¡pero cualquier sugerencia es bienvenida!


En mi opinión, esto depende en gran medida de su entorno exacto, pero antes de nada: en la mayoría de los casos, no debe utilizar Threads. Tasks son la solución más conveniente y más poderosa para eso.

  • Baja frecuencia de sondeo: temporizador + sondeo en el evento Tick :
    Un temporizador es fácil de manejar y detener. No hay que preocuparse por los subprocesos / tareas que se ejecutan en segundo plano, pero el manejo ocurre en el subproceso principal

  • Frecuencia media de sondeo: Task + await Task.Delay(delay) :
    await Task.Delay(delay) no bloquea un subproceso de agrupación de subprocesos, pero debido al cambio de contexto, el retardo mínimo es ~ 15 ms

  • Alta frecuencia de sondeo: Task + Thread.Sleep(delay)
    utilizable a 1 ms de retardo: en realidad lo hacemos para sondear nuestro dispositivo de medición USB

Esto se podría implementar de la siguiente manera:

int delay = 1; var cancellationTokenSource = new CancellationTokenSource(); var token = cancellationTokenSource.Token; var listener = Task.Factory.StartNew(() => { while (true) { // poll hardware Thread.Sleep(delay); if (token.IsCancellationRequested) break; } // cleanup, e.g. close connection }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

En la mayoría de los casos, solo puede usar Task.Run(() => DoWork(), token) , pero no hay una sobrecarga para proporcionar la opción TaskCreationOptions.LongRunning que le dice al programador de tareas que no use un subproceso de grupo de subprocesos normal.
Pero, como ve, las Tasks son más fáciles de manejar (y pueden await , pero no se aplican aquí). Especialmente la "detención" está simplemente llamando a cancellationTokenSource.Cancel() en esta implementación desde cualquier parte del código.

Incluso puedes compartir este token en múltiples acciones y detenerlas a la vez. Además, las tareas aún no iniciadas no se inician cuando se cancela el token.

También puede adjuntar otra acción a una tarea para ejecutar después de una tarea:

listener.ContinueWith(t => ShutDown(t));

Luego, esto se ejecuta después de que se completa la escucha y puede realizar la limpieza (la excepción t.Exception contiene la excepción de la acción de tareas si no tuvo éxito).


No se puede evitar el sondeo de la OMI.

Lo que puede hacer es crear un módulo, con su tarea / subproceso independiente que sondeará el puerto con regularidad. Basado en el cambio en los datos, este módulo levantará el evento que será manejado por las aplicaciones consumidoras


Tal vez:

public async Task Poll(Func<bool> condition, TimeSpan timeout, string message = null) { // https://github.com/dotnet/corefx/blob/3b24c535852d19274362ad3dbc75e932b7d41766/src/Common/src/CoreLib/System/Threading/ReaderWriterLockSlim.cs#L233 var timeoutTracker = new TimeoutTracker(timeout); while (!condition()) { await Task.Yield(); if (timeoutTracker.IsExpired) { if (message != null) throw new TimeoutException(message); else throw new TimeoutException(); } } }

Busque en SpinWait o en Task.Delay internals tampoco.