在 ASP.Net Webforms 上捕获线程异常
Catch thread exception on ASP.Net Webforms
我有私有方法,它尝试生成 pdf 文件,然后使用此 pdf 发送电子邮件。如果一切正常,则此方法将表单上的文本更改为 "Pdf were generated successfully"。
我的方法:
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));
}
和 returns 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,但不知道如何将其应用到我的案例中。
你试过这个吗:
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
}
在您创建并启动列表中的任务后,您为每个任务分配一个延续,以防抛出异常。但是根据您的代码,我看不到需要任务列表的必要性。您可以简单地使用任务对象并将其分配给延续。
据我了解,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;
}
这个方法如果没有异常就继续执行,如果有异常就处理。并考虑使用 Stephen Cleary 的 await
constructure or Run
method instead of StartNew
(great article about this)。
我有私有方法,它尝试生成 pdf 文件,然后使用此 pdf 发送电子邮件。如果一切正常,则此方法将表单上的文本更改为 "Pdf were generated successfully"。
我的方法:
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));
}
和 returns 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,但不知道如何将其应用到我的案例中。
你试过这个吗:
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
}
在您创建并启动列表中的任务后,您为每个任务分配一个延续,以防抛出异常。但是根据您的代码,我看不到需要任务列表的必要性。您可以简单地使用任务对象并将其分配给延续。
据我了解,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;
}
这个方法如果没有异常就继续执行,如果有异常就处理。并考虑使用 Stephen Cleary 的 await
constructure or Run
method instead of StartNew
(great article about this)。