2008-09-30 3 views
9

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, zuverlässig festzustellen, wann ein verwalteter Thread kurz vor dem Abschluss steht. Ich verwende eine Drittanbieter-Bibliothek, die Unterstützung für PDF-Dokumente bietet, und das Problem ist, dass ich die PDF-Komponente explizit initialisieren muss, um die PDF-Funktionalität zu verwenden, die Arbeit auszuführen und dann die Komponente explizit zu initialisieren, bevor der Thread beendet wird . Wenn das nicht initialisierte Objekt nicht aufgerufen wird, werden Ausnahmen ausgelöst, da nicht verwaltete Ressourcen nicht ordnungsgemäß freigegeben werden. Da die Thread-Klasse versiegelt ist und keine Ereignisse hat, muss ich die Thread-Instanz in eine Klasse einschließen und nur Instanzen dieser Klasse erlauben, die Arbeit zu erledigen.Gibt es eine Möglichkeit festzustellen, wann ein .NET-Thread beendet wird?

Ich sollte darauf hinweisen, dass dies Teil einer gemeinsam genutzten Bibliothek ist, die von mehreren Windows-Anwendungen verwendet wird. Ich habe vielleicht nicht immer die Kontrolle über Threads, die Aufrufe in diese Bibliothek machen.

Da ein PDF-Objekt die Ausgabe eines Aufrufs für diese Bibliothek sein kann, und da der aufrufende Thread andere Arbeit mit diesem Objekt ausführen kann, möchte ich die Bereinigungsfunktion nicht sofort aufrufen; Ich muss es versuchen, bevor der Thread beendet wird. Idealerweise möchte ich etwas wie ein Thread.Dispose-Ereignis abonnieren können, aber das fehlt mir.

Antwort

1

Ich denke, man kann eine [Auto | Manuell] verwenden Resetevent, die Sie festgelegt wird, wenn der Faden

endet
3

Sie wollen nicht System.Thread per se wickeln kann - es einfach mit Ihrem PDFWidget Klasse, die die Arbeit tut:

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(); 
    } 
} 

Sie auch ein ThreadPool Thread verwenden könnte, wenn das ist mehr nach Ihrem Geschmack - die beste Wahl hängt davon ab, wie viel Kontrolle Sie über den Thread benötigen.

0

Würden Sie Ihre PDF-Verwendung nicht einfach mit einer (wenn es sich um eine einzige Methode handelt) oder einer IDisposable-Lösung verpacken?

1

Was ist mit dem Aufruf einer Standardmethode im asynchronen Modus? z

//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); 
} 

Sehen Sie hier weitere Informationen bilden: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

1

Es gibt viele Möglichkeiten, dies zu tun, aber die einfachste ist zu tun, wie McKenzieG1 sagte und nur den Aufruf der PDF-Bibliothek wickeln. Nachdem Sie die PDF-Bibliothek im Thread aufgerufen haben, können Sie ein Event- oder ManualResetEvent-Ereignis verwenden, je nachdem, wie Sie auf das Ende des Threads warten müssen.

Vergessen Sie nicht, Event-Aufrufe an den UI-Thread mit einem BeginInvoke zu marshallen, wenn Sie den Event-Ansatz verwenden.