2011-07-06 7 views
5

¿Qué sucede con los datos que pasan a un trabajador de fondo y desde él?¿Qué sucede con los datos que pasan a un trabajador de fondo y desde él?

Los datos se pasan desde el hilo principal para el trabajador de fondo utilizando RunWorkerAsync:

backgroundWorker.RunWorkerAsync(myData); 

Esta es recibido en el controlador de eventos DoWork en el fondo de rosca:

myData = (Data)e.Argument; 

Después DoWork ha procesado el datos, lo devuelve usando e.Result:

e.Result = myData; 

Esto se recibe en controlador de eventos RunWorkerCompleted en el hilo principal:

myData = (Data)e.Result; 

BackgroundWorker está cuidando de pasar los datos entre las roscas. Espero pasar grandes cantidades de datos hacia y desde un trabajador en segundo plano, así que quiero saber cuál es la sobrecarga de esta transferencia, y si hay una forma mejor de procesar una gran cantidad de objetos en memoria en un trabajador de segundo plano. También me gustaría saber que es posible acceder a los datos del trabajador en segundo plano desde el hilo principal de forma segura para hilos.

Como referencia, estoy usando C#, .NET 3.5 y Windows Forms.

Respuesta

6

Realmente no hay sobrecarga (siempre que Data es una clase), ya que solo se pasa la referencia. Los datos en sí mismos no se "copian" en un hilo: todos los hilos pueden acceder a los datos en el proceso (en su mayor parte).

También me gustaría saber que es posible acceder a los datos en el fondo del trabajador desde el hilo principal de una manera segura para los subprocesos.

Sí, es posible acceder a los datos, pero para hacerlo de manera segura, deberá administrar la sincronización usted mismo. Esto generalmente requiere algo como un lock, aunque hay muchas opciones dependiendo de lo que está tratando de lograr.

+0

+1 para responder a la parte de la pregunta que se sincroniza con varios subprocesos. –

5

Los objetos son siempre pasado por referencia. No hay gastos generales en absoluto.

BackgroundWorker simplemente añade el objeto a una cola interna, a continuación, lo lee de la cola en el hilo de interfaz de usuario. (Esto es realmente hecho por Control.MarshaledInvoke)

+0

1 - excepto que el * siempre * sólo es cierto si los datos son una clase .... –

+0

@Reed: Dijo 'Object's, lo que implica el boxeo de los tipos de valor. Pero la redacción de la respuesta es ambigua. –

1

hay esencialmente ninguna sobrecarga en la transferencia; es solo una referencia de objeto (no hay ningún tipo de clasificación de los datos involucrados). Está protegido contra subprocesos siempre que el hilo principal no acceda a los datos entre la llamada a RunWorkerAsync y RunWorkerCompleted.

Cuestiones relacionadas