Estoy trabajando en un proyecto en C# .NET utilizando .NET framework versión 3.5.Práctica recomendada para el proceso continuo en C#
Mi proyecto tiene una clase llamada Focuser.cs que representa un dispositivo físico, un enfocador de telescopio, que puede comunicarse con una PC a través de un puerto serie (RS-232). Mi clase (Focuser) tiene propiedades como CurrentPosition, CurrentTemperature, ect, que representan las condiciones actuales del enfocador que pueden cambiar en cualquier momento. Entonces, mi clase Focuser necesita sondear continuamente el dispositivo para estos valores y actualizar sus campos internos. Mi pregunta es, ¿cuál es la mejor manera de realizar esta secuencia continua de sondeo? Ocasionalmente, el usuario deberá cambiar el dispositivo a un modo diferente que requerirá la capacidad de detener el sondeo, realizar alguna acción y luego reanudar el sondeo.
Mi primer intento fue usar un tiempo que marca cada 500ms y luego llama a un trabajador de fondo que luego sondea para una posición y una temperatura. Cuando el temporizador marca si el trabajador de segundo plano es Busy, simplemente regresa e intenta nuevamente 500 ms más tarde. Alguien sugirió que me deshaga del trabajador de fondo y lo haga en el evento tic del temporizador. Así que establecí la propiedad AutoReset del temporizador en falso y luego simplemente reinicié el temporizador cada vez que finaliza una encuesta. Estas dos técnicas parecían comportarse de la misma manera en mi aplicación, así que no estoy seguro de si una es mejor que la otra. También intenté crear un nuevo hilo cada vez que quiero hacer una operación de sondeo usando un nuevo ThreadStart y todo eso. Esto también parecía funcionar bien.
Debo mencionar otra cosa. Esta clase es parte de un servidor de objetos COM que básicamente significa que la biblioteca de clases que se produce se invocará a través de COM. No estoy seguro de si esto tiene alguna influencia en la respuesta, pero pensé que debería arrojarla allí.
La razón por la que estoy preguntando todo esto es que todas mis ejecuciones de prueba y las versiones de depuración funcionan bien, pero cuando hago una compilación de lanzamiento y trato de hacer llamadas a mi clase desde otra aplicación, esa aplicación se congela y Estoy teniendo dificultades para determinar la causa.
Cualquier consejo, sugerencias, comentarios serán apreciados.
Gracias, Jordan
algo como: – bigtang
bool BRET = ThreadPool.QueueUserWorkItem (nuevo WaitCallback (ReLoadThreadFunc)); – bigtang
private void ThreadFunc (object objState) {bool bMessageAvailable = false; objeto mensaje = nulo; string strLabel = string.Empty; int iCurChunk = 0; int iTotalChunk = 0; int iCount = 0; Resultado ret; // introduce el bucle bContinue = verdadero; while (bContinue) {// hacer cosas // sleep Thread.Dormir (m_iWaitTime_ms); }} – bigtang