【问题标题】:Can I avoid a possible hang by limiting the time a method is allowed to take?我可以通过限制方法允许使用的时间来避免可能的挂起吗?
【发布时间】:2011-07-06 20:04:33
【问题描述】:

我正在使用外部 DLL (pdfsharp) 打开(然后操作)大量 PDF 文件。我用:

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

问题是 - 它似乎挂在某些稀有文件上。我似乎没有任何超时 - 它只是在这条线上挂了几个小时。我们用这个代码读取了数千个文件,总是在小文件上,所以我想一个快速的解决方法可能是如果这个方法需要超过一两秒的时间就超时。但我没有看到一个简单的方法来做到这一点。我希望避免启动工作线程。

关于我如何限制这个线程允​​许的执行时间的任何想法,或者有没有更好(但简单)的方法?

【问题讨论】:

  • 如果我们可以将样本发送给 PdfSharp 团队,我相信他们会找到问题所在,但是 PDF 中的数据无法共享 - 并且是由另一个机构创建的。我们保留了一张“无法解析”的 PDF 表格——它只发生了数千次中的 6 次——但它们并没有什么不寻常的地方......

标签: vb.net pdfsharp


【解决方案1】:

Open() 调用不应挂起。绝不。如果您向我们提供导致 Open() 挂起的文件,我们可以对此进行调查。

您的程序是否在服务器上运行?您使用 PDFsharp 的 DEBUG 版本吗?也许它只是一个简单的 Debug.Assert() 被触发,但没有人能回答它。使用 RELEASE 构建可以解决这个问题。

【讨论】:

  • 我相信我使用的是发布版本。它是版本 1.31.1789.0(运行时版本 v2.0.50727)。
  • 显然按回车键发表评论。我正在使用程序集下载 dll。我刚刚下载了最新的项目并内置了 Release。有没有我可以确定的抓取 RELEASE 程序集的地方?它是版本 1.31.1789.0(运行时版本 v2.0.50727)。不幸的是,我无法发送其中一个 PDF。我没有在服务器上运行。
  • 我可以确认的是,如果 PDF 文件无效,它确实会挂起。
  • @Yuan 如果您提供的文件会导致 PDFsharp 挂起,那么我们就有机会解决该问题。有些无效文件导致异常,有些无效文件导致死循环,有些无效文件如果可以忽略错误可以读取。
【解决方案2】:

我们最终通过创建 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

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多