Могу ли я избежать возможного зависания, ограничив время, необходимое для метода? - PullRequest
1 голос
/ 07 июля 2011

Я использую внешнюю DLL (pdfsharp), чтобы открывать (затем манипулировать) множество файлов PDF. Я использую:

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

Проблема в том, что она зависает на некоторых редких файлах. Кажется, у меня нет тайм-аута - он просто часами висит на этой линии. Мы читаем тысячи файлов с этим кодом, всегда на крошечных файлах, поэтому я подумал, что быстрым обходным решением может быть как-то тайм-аут, если этот метод занимает больше секунды или двух. Но я не вижу простого способа сделать это. Я надеюсь избежать раскрутки рабочего потока.

Любые мысли о том, как я мог бы ограничить эти потоки разрешенным временем выполнения, или есть лучший (но простой) способ?

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Мы решили обойти эту проблему, создав AbortableBackgroundWorker.Я не уверен, чей это код, но мы нашли его в сети и поделились здесь.В редком случае, когда один из PDF-файлов зависает при вызове PdfSharp Open (), мы отменяем фоновый рабочий.

  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 голосов
/ 07 июля 2011

вызов Open () не должен зависать. Никогда. Если вы предоставите нам файл, который вызывает зависание Open (), мы можем это исследовать.

Ваша программа работает на сервере? Используете ли вы DEBUG сборку PDFsharp? Может быть, это простой Debug.Assert (), который запускается, но никто не может ответить на него. Использование сборки RELEASE решит эту проблему.

...