¿Puedo definir un trabajador de fondo en un método?¿Trabajador de fondo y recolección de basura?
private void DownLoadFile(string fileLocation){
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler((obj, args) => {
// Will be executed by back ground thread asynchronously.
args.Result = Download(fileLocation);
});
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((obj, args) => {
// will be executed in the main thread.
Result r = args.Result as Result;
ReportResult(r);
});
worker.RunWorkerAsync(fileLocation);
}
Pregunta: Si Función de descarga() toma un largo tiempo para descargar el archivo, se puede poner en GC y la recogida de objetos antes de que el trabajador RunWorkerCompleted() se ejecuta?
Recomendaría usar un delegado (Acción (de cadena)) y luego llamar a BeginInvoke. No veo ninguna necesidad de BackgroundWorker en este código. Todavía puede adjuntar un evento para cuando el método esté hecho. – JDB
Una forma mejor de hacerlo sería agregarlo a la cola del grupo de subprocesos mediante 'QueueUserWorkItem': http://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem.aspx –
@J ... El subproceso de subprocesos es agradable, pero hace que el manejo de la devolución de llamada * a la derecha SynchronizationContext * sea más difícil. Sin embargo, el TPL lo maneja muy bien. –