C# 捕获ASP.Net Webforms上的线程异常
我有一个私有方法,它尝试生成pdf文件,然后用这个pdf发送电子邮件。如果一切正常,则此方法将表单上的文本更改为Pdf成功生成 我的方法: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>
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;
}