有没有办法确定.NET线程何时终止?

时间:2008-09-30 14:07:15

标签: .net multithreading

我试图找出是否有办法可靠地确定托管线程何时即将终止。我正在使用包含对PDF文档的支持的第三方库,问题是为了使用PDF功能,我必须显式初始化PDF组件,完成工作,然后在线程终止之前显式取消初始化组件。如果未调用uninitialize,则抛出异常,因为未正确释放非托管资源。由于线程类是密封的并且没有事件,我必须将线程实例包装到类中,并且只允许此类的实例执行工作。

我应该指出,这是多个Windows应用程序使用的共享库的一部分。我可能无法控制线程调用此库。

由于PDF对象可能是对此库的调用的输出,并且由于调用线程可能会对该对象执行其他一些操作,因此我不想立即调用清理函数;我需要尝试在线程终止之前做到这一点。理想情况下,我希望能够订阅Thread.Dispose事件,但这就是我所缺少的。

7 个答案:

答案 0 :(得分:3)

您不希望自己包装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主题,如果你的口味更合适 - 最好的选择取决于你对线程需要多少控制权。

答案 1 :(得分:1)

我认为您可以使用线程终止时设置的[Auto | Manual] ResetEvent

答案 2 :(得分:1)

答案 3 :(得分:1)

在异步模式下调用标准方法怎么样? e.g

//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/en-us/library/2e08f6yc.aspx

答案 4 :(得分:1)

有很多方法可以做到这一点,但最简单的方法是像McKenzieG1那样说,只需将调用包装到PDF库中。在线程中调用PDF库后,您可以使用Event或ManualResetEvent,具体取决于您需要等待线程完成的方式。

如果您正在使用Event方法,请不要忘记使用BeginInvoke封送对UI线程的事件调用。

答案 5 :(得分:0)

难道您不是只使用finally(如果是单个方法)或IDisposable包装PDF用法吗?

答案 6 :(得分:0)

http://wintellect.com检查Powerthreading库。