【问题标题】:Catch thread exception on ASP.Net Webforms在 ASP.Net Webforms 上捕获线程异常
【发布时间】:2015-06-19 21:03:43
【问题描述】:

我有私有方法,它尝试生成 pdf 文件,然后用这个 pdf 发送电子邮件。如果一切正常,则此方法将表单上的文本更改为“Pdf 已成功生成”。

我的方法:

private void RegenerateSubmissionPdf(int submissionId)
{
    var submissionPath = PublisherConfigurationManager.SubmissionPath + submissionId;

    var tasks = new List<Task>
    {
        HttpContext.Current.GeneratePdfTask(submissionPath, submissionId, PublisherConst.SubmissionPdfName,
            _objSubmission.SaveSubmissionPdf)
    };

    tasks.SendEmailTasks(u => SendRegenerateSubmissionPdfEmail(submissionId, u));
}

返回Task的方法:

public static Task GeneratePdfTask(this HttpContext context, string path, int submissionId, string pdfName, Action<int, byte[]> postAction = null)
{
    var local = context;
    return Task.Factory.StartNew(() =>
    {
        HttpContext.Current = local;
        SessionHelper.Set(SessionKey.IsPdfRendering, true);
        var pdfFile = new PdfGenerator().Generate(path, pdfName, submissionId);
        if (postAction != null && pdfFile != null)
        {
            postAction(submissionId, pdfFile);
        }

    });
}

在最后一种方法中,有时我会遇到异常(可能路径错误,某些图像丢失或其他)。我找到了this solution,但不知道如何将它应用到我的案例中。

【问题讨论】:

    标签: c# asp.net multithreading pdf exception-handling


    【解决方案1】:

    据我了解,SendEmailTasks 是一种扩展方法,但您可以只使用一个任务,如下所示:

    private void RegenerateSubmissionPdf(int submissionId)
    {
        var submissionPath = PublisherConfigurationManager.SubmissionPath + submissionId;
    
        var task = HttpContext.Current.GeneratePdfTask(submissionPath, submissionId, PublisherConst.SubmissionPdfName,
                _objSubmission.SaveSubmissionPdf);
        task.ContinueWith(t =>  
          SendRegenerateSubmissionPdfEmail(submissionId, task),  
          TaskContinuationOptions.OnlyOnRanToCompletion);
        task.ContinueWith(t =>  
          HandleException(task.Exception),  
          TaskContinuationOptions.OnlyOnFaulted);
        await task;
    }
    

    如果没有异常,该方法将继续执行,如果有异常,将处理该异常。并考虑使用await 构造或Run 方法而不是StartNewgreat article about this by Stephen Cleary)。

    【讨论】:

    • 关于列表 - 我只是为这个示例制作了 1 个元素的列表。在我的应用程序中,我使用 1 到 3 Task
    【解决方案2】:

    你试过了吗:

    private void RegenerateSubmissionPdf(int submissionId)
    {
        var submissionPath = PublisherConfigurationManager.SubmissionPath + submissionId;
    
        var tasks = new List<Task>
        {
            HttpContext.Current.GeneratePdfTask(submissionPath, submissionId, PublisherConst.SubmissionPdfName,
                _objSubmission.SaveSubmissionPdf)
        };
        tasks.ForEach(t => t.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted));
        tasks.SendEmailTasks(u => SendRegenerateSubmissionPdfEmail(submissionId, u));
    }
    
    private void ExceptionHandler(Task task)
    {
        // Handle exception
    }
    

    在您创建并启动列表中的任务后,您可以为每个任务分配一个延续,以防引发异常。但是根据您的代码,我看不出需要任务列表。您可以简单地使用任务对象并为其分配延续。

    【讨论】:

    • 似乎是的,但 Handler 有一些问题:D
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2015-08-31
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多