varias - Prioridad del hilo del objeto.NET Backgroundworker
progressbar mientras se ejecuta un proceso c# (4)
Estoy tratando de usar el objeto .NET Backgroundworker en una aplicación que estoy desarrollando.
Todo el material en Internet dice que este objeto se ejecuta en el "fondo" pero en ninguna parte he podido confirmar que este hilo de fondo se ejecute en modo de "baja prioridad" . Esta pregunta surge porque en Windows (supongo) una tarea en segundo plano puede ejecutarse en un modo de prioridad ''normal'' o ''por debajo de lo normal'' o ''bajo''.
En mi aplicación, traté de establecer la prioridad yo mismo dentro de la función DoWork llamando ...
Thread.CurrentThread.Priority=ThreadPriority.Lowest
...
pero esto parece no tener ningún efecto. ¿El trabajador de fondo ignora esta llamada?
Me gustaría explicar algo más:
Mi aplicación es un cliente de Internet que recopila datos en tiempo real sobre la temperatura, la humedad, etc. de una cámara y los sube a una página web (no a un servicio web) usando
system.net.webclient.UploadValuesAsync(...)
llamadas
Escribí la aplicación de manera que la GUI del cliente recopila los datos de la cámara, los marca con el tiempo y luego los pone en cola para su carga como tal
...
Synclock objlock
debug.print("Queueing reading...")
dataQ.Enque(reading)
End Synclock
...
La función Dowork de Backgroundworker se quita y luego se carga como ...
..............
Do
if dataQ.count() <> 0 then
Synclock objlock
reading = dataQ.DeQue()
End Synclock
Dim client As New System.Net.WebClient
...put the reading in NameValueCollection and upload to server page
req = new NameValueCollection
...
...
client.UploadValuesAsync(uri, "POST", req)
endif
thread.sleep(1) ''without this line the CPU usage goes upto 100% and seems to slow other tasks!
Loop
................
Cuando ejecuto el programa, encuentro que cada vez que se llama a UploadValuesAsync, se imprime la ventana de depuración. También agregué declaraciones de depuración para ver cuántas lecturas hay en la cola en cualquier momento. Si esta tarea se ejecuta realmente con baja prioridad, esperaba ver que el recuento de colas aumenta rápidamente a medida que se adquieren los datos y luego disminuyen solo cuando el primer plano está inactivo y no se están adquiriendo datos. Pero este no es el caso. Tan pronto como se agrega una lectura a la cola, se quita de la cola y se carga. ¡Entonces el recuento de cola siempre es 1 o 0!
¿Hay algo mal en mi enfoque? ¿No debería usar el objeto de fondo de trabajo?
Por cierto, esto es en una computadora portátil de doble núcleo con Windows XP.
No pretende ser de baja prioridad: background significa a: no el subproceso de interfaz de usuario, y b: no mantendrá vivo un proceso. En realidad, probablemente se relaciona con los hilos ThreadPool
.
Si desea un hilo de prioridad específico, utilice su propio objeto Thread
, pero no recomendaría incluso esto normalmente ...
Además, "fondo" no significa "cuando está inactivo". Incluso en una máquina de núcleo único, probablemente verá que ambos hilos obtienen la mayor cantidad de tiempo (si lo desean). Aún más en multi-core.
Sí, algo está mal con tu enfoque; básicamente estás muy cerca cuando la cola está vacía. Cualesquiera que sean las prioridades del hilo, esa es una mala idea.
No hay nada de malo con el uso de un asistente de fondo para esto, pero el enqueuing / dequeuing solo debería usar una cola de productor / consumidor que bloquea cuando intentas eliminar la cola cuando no hay nada preparado.
Tengo una implementación de ejemplo de una cola de productor / consumidor en mi tutorial de subprocesos : vea la mitad de la página enlazada. Por cierto, querrás decir de alguna manera el proceso de eliminación de que está terminado. (Por ejemplo, poner en cola una referencia nula u otro valor especial). Ese código fue escrito pre-genéricos, pero debería ser fácil de actualizar.
Solo para agregar a lo que Jon y Marc ya han dicho:
Los hilos de fondo no tienen menor prioridad. La diferencia entre los hilos de primer plano y de fondo es que el CLR cerrará el proceso una vez que no se estén ejecutando más hilos de primer plano. Los subprocesos del grupo de subprocesos son subprocesos de fondo.
En realidad, puede establecer la prioridad de un hilo de grupo de subprocesos, pero como no tiene control sobre qué subproceso de grupo de subprocesos realmente ejecutará su tarea, no es aconsejable hacerlo. Si necesita hilos de una prioridad específica, debe crearlos utilizando el tipo de subproceso y establecer la prioridad en la instancia como desee.
Es posible que desee ver esta implementación de subprocesos de trabajo. Ha protegido a los constructores para especificar el nombre del hilo, la prioridad del hilo y si el hilo es un hilo de fondo.