Pregunta

Tengo una colección personalizada (un ObservableQueue seguro para subprocesos).Implementé la lógica de negocios dentro de la clase de colección (es decir,retire los elementos uno por uno y expóngalos al exterior).Esto está funcionando bien.Para evitar que la colección bloquee el hilo en el que se inicializa, OnservableQueue implementa un hilo para realizar ese trabajo.Ahora bien, no estoy completamente seguro de los peligros que puedan surgir.

¿Es una mala idea inicializar (¡no iniciar!sólo inicializar) el hilo en el constructor?¿Y cuál sería una buena práctica, si no la mejor, para terminar el hilo?Tenga en cuenta que no necesito saber cómo terminar un hilo, eso está funcionando bien, estoy bastante interesado en saber si hay algo mal al hacerlo usando el patrón desechable o creando un método al que sería necesario llamar para terminar el hilo.Si se implementa IDisposable ¿Hay algo que deba tener en cuenta respecto a la recogida/cola?

Editar: En realidad, el hilo sólo está preinicializado para evitar NullReferenceException se arroje en el Método Enqueue, donde se inicializa correctamente nuevamente (se supone que el Método Enqueue verifica si ya se está ejecutando un subproceso en cola y, en caso contrario, inicia uno nuevo).Tenga en cuenta que siempre que todos los elementos se retiren de la cola y el hilo haya hecho su trabajo, tampoco estará vivo, por lo que cada vez que la cola esté vacía y se agregue un nuevo elemento, se iniciará un nuevo hilo para procesar la cola:

if (!_dequeuingThread.IsAlive)
{
    // start the dequeuing thread
    _dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
    _dequeuingThread.Name = "DeQueueThread";
    _dequeuingThread.Start();
}

La declaración if necesita un hilo inicializado.Hay otras formas posibles de lograr esto, pero inicializar previamente el hilo parecía la menos molesta.Verá que después de verificar si el hilo está activo, lo cual no debería ocurrir cuando se inicializa previamente, se inicializa nuevamente correctamente.

¿Fue útil?

Solución

No veo nada malo en inicializar en el constructor, pero obviamente tengo en cuenta que se inicializarán en un hilo diferente al hilo de trabajo.

En cuanto a detenerse, generalmente tengo un indicador booleano volátil que el trabajador verifica para seguir funcionando.Si su subproceso de trabajo duerme, haga que espere un evento en lugar de dormir, para que pueda reactivarlo inmediatamente cuando lo detenga.

Otros consejos

Parece haber un problema con el hecho de que el consumidor inicializará este objeto de colección llamando a su constructor y pensaría que el objeto está inicializado (eso es lo que se supone que debe hacer el constructor), lo cual no es correcto ya que se está produciendo la inicialización. en un hilo separado creado por el constructor.Entonces, básicamente necesitas implementar algún tipo de "API asincrónica en este objeto" para inicializar esta colección de modo que el consumidor llame al método de inicialización (después de crear el objeto usando el constructor) y luego pase una devolución de llamada al método de inicialización o Al registrarse en un evento en el objeto de colección, el consumidor sabe que la inicialización se ha completado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top