2011-07-06 4 views
1

J'utilise une DLL externe (pdfsharp) pour ouvrir (puis manipuler) beaucoup de fichiers PDF. J'utilise:Puis-je éviter une éventuelle suspension en limitant le temps qu'une méthode est autorisée à prendre?

Dim inputDocument = Pdf.IO.PdfReader.Open(PDFPath, IO.PdfDocumentOpenMode.ReadOnly) 

Le problème est - il semble s'accrocher sur certains fichiers rares. Je ne semble pas avoir de délai d'attente - il reste suspendu pendant des heures sur cette ligne. Nous avons lu des milliers de fichiers avec ce code, toujours sur des fichiers minuscules, donc je pensais qu'une solution de contournement rapide pourrait être d'attendre si la méthode prend plus d'une seconde ou deux. Mais je ne vois pas un moyen simple de le faire. J'espère éviter de filer un fil de travail.

Des réflexions sur la façon dont je pourrais limiter ces threads ont permis le temps d'exécution, ou existe-t-il un meilleur (mais simple) moyen?

+1

Si nous pouvions envoyer des échantillons à l'équipe de PdfSharp, je suis sûr qu'ils pourraient trouver ce que le problème, mais les données contenues dans les fichiers PDF ne peuvent pas être partagés - et est créé par une autre institution. Nous gardons une table des fichiers PDF 'incomparables' - cela ne s'est produit que 6 fois sur des milliers - mais il n'y a rien d'inhabituel à les regarder ... – aSkywalker

Répondre

0

Nous avons fini par contourner ce problème en créant un AbortableBackgroundWorker. Je ne suis pas sûr du code qui a fini par être - mais nous l'avons trouvé en ligne et le partage ici. Dans les rares cas où l'un des fichiers PDF bloque l'appel PdfSharp Open(), nous abandonnons le worker d'arrière-plan.

Public Class AbortableBackgroundWorker 
    Inherits BackgroundWorker 

    Private workerThread As Thread 

    Protected Overrides Sub OnDoWork(e As DoWorkEventArgs) 
     workerThread = Thread.CurrentThread 
     Try 
      MyBase.OnDoWork(e) 
     Catch generatedExceptionName As ThreadAbortException 
      e.Cancel = True 
      'We must set Cancel property to true! 
      'Prevents ThreadAbortException propagation 
      Thread.ResetAbort() 
     End Try 
    End Sub 


    Public Sub Abort() 
     If workerThread IsNot Nothing Then 
      workerThread.Abort() 
      workerThread = Nothing 
     End If 
    End Sub 

End Class 
0

L'appel Open() ne doit pas se bloquer. Jamais. Si vous nous fournissez un fichier qui bloque Open(), nous pouvons étudier cela.

Votre programme fonctionne-t-il sur un serveur? Utilisez-vous une version DEBUG de PDFsharp? Peut-être que c'est juste un simple Debug.Assert() qui est déclenché, mais personne ne peut y répondre. L'utilisation d'une construction RELEASE résoudrait cela.

+0

Je crois que j'utilise une version de sortie. C'est la version 1.31.1789.0 (version d'exécution v2.0.50727). – aSkywalker

+0

Apparemment, appuyez sur Entrée pour écrire le commentaire. J'utilisais la DLL de téléchargement des assemblys. Je viens de télécharger le dernier projet et intégré dans la version. Y a-t-il un endroit pour saisir les assemblées de RELEASE dont je peux être sûr? C'est la version 1.31.1789.0 (version d'exécution v2.0.50727). Malheureusement, je ne peux pas envoyer l'un des PDF. Je ne cours pas sur un serveur. – aSkywalker

+0

Tout ce que je peux confirmer c'est que ça bloque, si le fichier PDF n'est pas valide. – Yuan

Questions connexes