start - c#.net threading
¿Hay alguna manera de determinar cuándo termina una cadena.NET? (7)
¿No podría simplemente envolver su uso de PDF con un método final (si es un único método), o en un IDisposable?
Estoy tratando de averiguar si hay una forma 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.
Debo señalar que esto es parte de una biblioteca compartida utilizada por múltiples aplicaciones de Windows. Es posible que no siempre tenga el control de los hilos que hacen llamadas a esta biblioteca.
Como un objeto PDF puede ser el resultado de una llamada a esta biblioteca, y dado que el hilo 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.
¿Qué tal si llamamos a un método estándar en modo asíncrono? p.ej
//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);
}
Vea aquí más información: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx
Captura la ThreadAbortExcpetion.
http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx
Consulte la biblioteca Powerthreading en http://wintellect.com .
Creo que puede usar un [Reset | Auto] ManualEvent que se configurará cuando finalice el hilo
No desea ajustar System.Thread
per se: simplemente PDFWidget
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 puede usar un hilo de ThreadPool
, si es más de su gusto, la mejor opción depende de cuánto control necesita sobre el hilo.
Hay muchas maneras en que puede hacer esto, pero la más simple es hacer lo que McKenzieG1 dijo 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.