Есть ли способ определить, когда поток .NET завершается? - PullRequest
9 голосов
/ 30 сентября 2008

Я пытаюсь выяснить, есть ли способ надежно определить, когда управляемый поток собирается завершиться. Я использую стороннюю библиотеку, которая включает в себя поддержку документов PDF, и проблема в том, что для использования функциональности PDF мне нужно явно инициализировать компонент PDF, выполнить работу, а затем явно деинициализировать компонент до завершения потока , Если не инициализировать не вызывается, генерируются исключения, потому что неуправляемые ресурсы не высвобождаются правильно. Так как класс потока запечатан и не имеет событий, я должен заключить экземпляр потока в класс и разрешить работу только экземплярам этого класса.

Следует отметить, что это часть общей библиотеки, используемой несколькими приложениями Windows. Я не всегда могу контролировать потоки, делающие вызовы в эту библиотеку.

Поскольку объект PDF может быть результатом вызова этой библиотеки, и поскольку вызывающий поток может выполнять какую-то другую работу с этим объектом, я не хочу вызывать функцию очистки немедленно; Мне нужно попытаться сделать это прямо перед тем, как поток завершается. В идеале я хотел бы иметь возможность подписаться на что-то вроде события Thread.Dispose, но это то, что мне не хватает.

Ответы [ 7 ]

3 голосов
/ 30 сентября 2008

Вы не хотите обернуть 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 голос
/ 30 сентября 2008

Есть много способов сделать это, но самый простой - сделать, как сказал McKenzieG1 , и просто обернуть вызов в библиотеку PDF. После того, как вы вызвали PDF-библиотеку в потоке, вы можете использовать Event или ManualResetEvent в зависимости от того, как вам нужно дождаться окончания потока.

Не забывайте перенаправлять вызовы событий в поток пользовательского интерфейса с помощью BeginInvoke, если вы используете подход Event.

1 голос
/ 30 сентября 2008

как насчет вызова стандартного метода в асинхронном режиме? * 1001 например *

//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

1 голос
/ 30 сентября 2008
1 голос
/ 30 сентября 2008

Я думаю, что вы можете использовать [Auto | Manual] ResetEvent, который вы установите при завершении потока

0 голосов
/ 30 сентября 2008

Проверьте библиотеку Powerthreading на http://wintellect.com.

0 голосов
/ 30 сентября 2008

Не могли бы вы просто обернуть использование PDF с помощью finally (если это единственный метод) или в IDisposable?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...