我有一个长期运行的方法,我希望在后台线程上运行。该方法使用MailChimp api订阅一长串电子邮件地址。
我不想要我的#34; Web Forms"应用程序在此任务运行时挂起,但我确实想要处理发生的任何异常。
我们调用以下方法来运行:
ExecuteAsyncBatchRegistration(mcitems);
以下是我们刚刚调用的方法:
public async Task ExecuteAsyncBatchRegistration(List<MailChimpItem> mcitems)
{
GenericResponse response = new GenericResponse();
await Task.Run(() =>
{
response = ExecuteBatchRegistration(mcitems);
if (response.Success == false)
{
ErrorHandler.WriteError(response.Exception);
}
});
}
方法调用 ErrorHandler.WriteError()使用 HttpContext.Current ,以便它可以告诉我页面URL,IP地址等。但是,在这个实例中 HttpContext.Current 为NULL。
我可以通过更改方法解决此问题:
public async Task ExecuteAsyncBatchRegistration(List<MailChimpItem> mcitems)
{
GenericResponse response = new GenericResponse();
response = await Task<GenericResponse>.Run(() =>
{
return ExecuteBatchRegistration(mcitems);
});
if (response.Success == false)
{
ErrorHandler.WriteError(response.Exception);
}
}
该方法的后一版本的问题是应用程序挂起:它似乎不会在后台异步运行。
如何异步运行此方法并保留HttpContent.Current?
答案 0 :(得分:1)
如果您不希望Web表单挂起(即,您希望将结果返回给用户并卸载进程),那么您需要从HttpContext捕获所需的数据并将其传递给已卸载的长时间运行任务。请勿在该任务中再次访问po vao.vertices[0].position
,因为没有任务。如果您希望HttpContext
可用,那么您无法结束请求,这意味着表单将“挂起”并且您在请求线程上进行处理。保持HttpContext而不使用户的Web浏览器挂起的唯一另一个好方法是使用javascript进行调用。通常我建议不要在Web上下文中运行它,而是将其卸载到服务或使用类似HangFire的东西,但这两者都有相同的限制,你不能与任何类型的HttpContext
通信,你必须收集陈述并将其传递给卸载的任务。