有没有一种方法可以确定.NET线程何时终止?
我试图找出是否有一种方法可以可靠地确定托管线程何时将要终止。我正在使用包含对PDF文档的支持的第三方库,问题在于,为了使用PDF功能,我必须显式初始化PDF组件,进行工作,然后在线程终止之前显式取消初始化该组件。 。如果未调用uninitialize,则会引发异常,因为未正确释放非托管资源。由于线程类是密封的并且没有事件,因此我必须将线程实例包装到一个类中,并且仅允许此类的实例完成工作。
我应该指出,这是多个Windows应用程序使用的共享库的一部分。我可能并不总是控制对这个库进行调用的线程。
由于PDF对象可能是对该库的调用的输出,并且由于调用线程可能对该对象进行了其他工作,所以我不想立即调用cleanup函数;我需要尝试在线程终止之前立即执行操作。理想情况下,我希望能够订阅诸如Thread.Dispose事件之类的东西,但这就是我所缺少的。
解决方案
我认为我们可以使用[Auto | Manual] ResetEvent,该方法将在线程终止时设置
捕获ThreadAbortExcpetion。
http://msdn.microsoft.com/zh-CN/library/system.threading.threadabortexception.aspx
我们本身不想包装System.Thread
只是将其与正在执行工作的PDFWidget
类一起组成:
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(); } }
我们也可以使用ThreadPool
线程,如果我们更喜欢该线程,则最佳选择取决于我们需要对该线程进行多少控制。
我们是否只用finally(如果是单个方法)或者用IDisposable来包装PDF使用情况?
在http://wintellect.com上检查Powerthreading库。
在异步模式下调用标准方法该怎么办?
例如
//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); }
请参阅此处表格,了解更多信息:http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx
我们可以通过多种方法来执行此操作,但是最简单的方法是按照McKenzieG1的说明进行操作,然后将调用包装到PDF库中。在线程中调用PDF库之后,可以根据需要等待线程完成的方式使用Event或者ManualResetEvent。
如果我们使用的是Event方法,请不要忘记使用BeginInvoke将事件调用封送给UI线程。