Tengo un servicio responsable de muchas tareas, una de las cuales es iniciar trabajos (uno a la vez) en un hilo separado (threadJob child), estos trabajos pueden tomar bastante tiempo y¿Cómo puede un subproceso secundario notificar a un subproceso padre de su estado/progreso?
tienen varias fases a ellos que necesito informarles.
siempre tan a menudo una aplicación que llama solicita el estado del servicio (GetStatus), esto significa que de alguna manera el servicio necesita saber en qué momento el trabajo (hilo hijo) es
en, mi esperanza era que al algunos hitos el subproceso secundario podría de alguna manera informar (SetStatus) el subproceso principal (servicio) de su estado y el servicio podría devolver esa información
a la aplicación que realiza la llamada.
Por ejemplo - que estaba buscando hacer algo como esto:
class Service
{
private Thread threadJob;
private int JOB_STATUS;
public Service()
{
JOB_STATUS = "IDLE";
}
public void RunTask()
{
threadJob = new Thread(new ThreadStart(PerformWork));
threadJob.IsBackground = true;
threadJob.Start();
}
public void PerformWork()
{
SetStatus("STARTING");
// do some work //
SetStatus("PHASE I");
// do some work //
SetStatus("PHASE II");
// do some work //
SetStatus("PHASE III");
// do some work //
SetStatus("FINISHED");
}
private void SetStatus(int status)
{
JOB_STATUS = status;
}
public string GetStatus()
{
return JOB_STATUS;
}
};
Así, cuando un trabajo se debe realizar runTask() se llama y esto pone en marcha el hilo (threadJob). Esto se ejecutará y realizará algunos pasos (utilizando SetStatus para establecer el nuevo estado en
varios puntos) y finalmente finalizará. Ahora, también existe la función GetStatus() que debe devolver el ESTADO siempre que se solicite (desde una aplicación de llamada usando IPC): este estado
debe reflejar el estado actual de la tarea que ejecuta threadJob.
Entonces, mi problema es bastante simple ... ¿Cómo puede threadJob (o más específicamente, PerformWork()) devolver al servicio el cambio en el estado de manera segura (supongo que mi ejemplo anterior de SetStatus/GetStatus es
inseguro)? ¿Necesito usar eventos? Supongo que no puedo simplemente cambiar JOB_STATUS directamente ... ¿Debo usar un BLOQUEO (si es así en qué?) ...
No es 100% claro en cuanto a cómo funciona: de su muestra cómo se establece realmente el estado al llamar a SetStatus ... solo se usa con instantánea (estado) pero no hay implementación para el delegado JobStatusChangHandler. Además, ¿cómo funcionaría GetStatus en este caso? – Shaitan00
La persona que llama debe suscribirse al evento JobStatusChange primero. Cuando se llama instantánea (estado), invoca a todos los controladores de eventos. En lugar de sondear el estado a través de GetStatus, la clase de servicio notifica a la persona que llama cada vez que el estado cambia usando un método de evento. –
debe tener cuidado al usar el bloqueo (esto) ya que no sabe quién más intentará bloquear su clase. Esto no es completamente seguro si invita a un punto muerto. –