2008-09-30 20 views
9

Estoy tratando de averiguar si hay una manera de determinar de manera confiable cuándo está a punto de finalizar un subproceso administrado. Estoy usando una biblioteca de terceros que incluye soporte para documentos PDF y el problema es que para usar la funcionalidad PDF, tengo que inicializar explícitamente el componente PDF, hacer el trabajo, luego desinicializar explícitamente el componente antes de que termine el hilo . Si no se llama a uninicializador, se lanzan excepciones porque los recursos no administrados no se están liberando correctamente. Como la clase de subprocesos está sellada y no tiene eventos, debo envolver la instancia de subproceso en una clase y solo permitir que las instancias de esta clase hagan el trabajo.¿Hay alguna forma de determinar cuándo termina una cadena .NET?

Debo señalar que esto es parte de una biblioteca compartida utilizada por varias aplicaciones de Windows. Es posible que no siempre tenga el control de los hilos que hacen llamadas a esta biblioteca.

Dado que un objeto PDF puede ser el resultado de una llamada a esta biblioteca, y dado que la cadena de llamada puede hacer otro trabajo con ese objeto, no quiero llamar inmediatamente a la función de limpieza; Necesito intentar hacerlo justo antes de que el hilo termine. Idealmente, me gustaría poder suscribirme a algo así como un evento Thread.Dispose, pero eso es lo que me estoy perdiendo.

Respuesta

1

Creo que se puede utilizar un [Auto | Manual] ResetEvent el que va a configurar cuando el subproceso termina

3

Usted no quiere envolver System.Thread per se - acaba de componer con su clase PDFWidget que está haciendo el trabajo:

class PDFWidget 
{ 
    private Thread pdfWorker; 
    public void DoPDFStuff() 
    { 
     pdfWorker = new Thread(new ThreadStart(ProcessPDF)); 
     pdfWorker.Start(); 
    } 

    private void ProcessPDF() 
    { 
     OtherGuysPDFThingie pdfLibrary = new OtherGuysPDFThingie(); 
     // Use the library to do whatever... 
     pdfLibrary.Cleanup(); 
    } 
} 

También es posible usar un hilo ThreadPool, si eso es más de su gusto: la mejor opción depende de cuánto control necesita sobre el hilo.

0

¿No podría simplemente envolver su uso de PDF con finalmente (si es un único método), o en un IDisposable?

1

¿qué tal llamar a un método estándar en modo asíncrono? por ejemplo

//declare a delegate with same firmature of your method 
public delegete string LongMethodDelegate(); 

//register a callback func 
AsyncCallback callbackFunc = new AsyncCallback (this.callTermined); 

//create delegate for async operations 
LongMethodDelegate th = new LongMethodDelegate (yourObject.metyodWichMakeWork); 

//invoke method asnync. 
// pre last parameter is callback delegate. 
//the last parameter is an object wich you re-find in your callback function. to recovery return value, we assign delegate itSelf, see "callTermined" method 
longMethod.beginInvoke(callbackFunc,longMethod); 

//follow function is called at the end of thr method 
public static void callTermined(IAsyincResult result) { 
LongMethodDelegate method = (LongMethodDelegate) result.AsyncState; 
string output = method.endInvoke(result); 
Console.WriteLine(output); 
} 

Consulte aquí la forma más información: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

1

Hay muchas maneras de hacer esto, pero la más sencilla es hacer como McKenzieG1 dicho y simplemente envolver la llamada a la biblioteca PDF. Después de haber llamado a la biblioteca de PDF en el hilo, puede usar un Evento o Evento de Reposición Manual dependiendo de cómo necesite esperar a que termine el hilo.

No olvide coordinar las llamadas de eventos al hilo de UI con un BeginInvoke si está utilizando el enfoque de Evento.

Cuestiones relacionadas