C# 捕获ASP.Net Webforms上的线程异常

C# 捕获ASP.Net Webforms上的线程异常,c#,asp.net,multithreading,pdf,exception-handling,C#,Asp.net,Multithreading,Pdf,Exception Handling,我有一个私有方法,它尝试生成pdf文件,然后用这个pdf发送电子邮件。如果一切正常,则此方法将表单上的文本更改为Pdf成功生成 我的方法: private void RegenerateSubmissionPdf(int submissionId) { var submissionPath = PublisherConfigurationManager.SubmissionPath + submissionId; var tasks = new List<Task>

我有一个私有方法,它尝试生成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));
}
在最后一种方法中,有时会出现异常,可能是路径错误,某些图像丢失或其他原因。我找到了,但不知道如何将其应用到我的案例中。

您是否尝试过:

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
}
创建并启动列表中的任务后,为每个任务分配一个延续,以防引发异常。但是根据你的代码,我看不出有必要列出任务。您可以简单地使用task对象并将其指定为continuation。

据我所知,SendEmailTasks是一种扩展方法,但您只能使用一个task,如下所示:

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;
}

如果没有异常,此方法将继续执行,如果有异常,则将处理该异常。考虑使用结构或方法来代替Stephen Cleary的StimeNo../P>似乎是的,但是处理程序有一些问题:Doad List-我只为这个示例做了1个元素的列表。在我的应用程序中,我使用1到3个任务
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;
}