处理后台任务的返回值 - 异步等待

时间:2017-03-17 14:43:02

标签: c# asp.net async-await httpcontext

我有一个长期运行的方法,我希望在后台线程上运行。该方法使用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?

1 个答案:

答案 0 :(得分:1)

如果您不希望Web表单挂起(即,您希望将结果返回给用户并卸载进程),那么您需要从HttpContext捕获所需的数据并将其传递给已卸载的长时间运行任务。请勿在该任务中再次访问po vao.vertices[0].position,因为没有任务。如果您希望HttpContext可用,那么您无法结束请求,这意味着表单将“挂起”并且您在请求线程上进行处理。保持HttpContext而不使用户的Web浏览器挂起的唯一另一个好方法是使用javascript进行调用。通常我建议不要在Web上下文中运行它,而是将其卸载到服务或使用类似HangFire的东西,但这两者都有相同的限制,你不能与任何类型的HttpContext通信,你必须收集陈述并将其传递给卸载的任务。