QueueUserWorkItem不允许响应返回

时间:2014-06-06 19:45:38

标签: c# jquery asp.net ajax asynchronous

我正在编写一个ASP.NET 3.5网络应用程序,我希望“快速忘记”#34;来自Web的任务。

想法如下:

  • 用户输入带有表格的网页,选择一些项目并使用按钮提交数据。
  • 按下按钮时,会使用数据激活AJAX请求。
  • ASP.NET应用程序启动(后台?)进程。如果流程成功启动,应用程序将通过AJAX回复客户端。
  • 该过程创建一个包含数据的文本文件,将其保存到目录中,然后触发一个SSIS包(一旦完成该过程就会将用户邮寄给用户),因此不需要回调。

我的问题是,当我使用ThreadPool.QueueUserWorkItem()来触发进程时,我的Web界面永远不会收到AJAX答案。浏览器没有冻结,只是坐在那里等待。

代码:

AJAX电话

$("#btn-actualizar-instrumentos").click(function(e) {
    e.preventDefault();
    var contador = 0;
    $.each(state, function(i, val) {
        contador += val.length;
    });
    if (contador == 0) {
        alert("No se han seleccionado instrumentos para actualizar.");
        return;
    }
    else {
        $("#btn-actualizar-instrumentos").button("option", "disabled", true)
        $.blockUI({ message: "Enviando instrumentos seleccionados..." });
        var textoFinal = JSON.stringify(state);
        var idsFinal = JSON.stringify(ids);
        $.ajax({
            type: "POST",
            url: 'SDI_obtenerarchivosbloomberg.aspx',
            //data: textoFinal,
            data: idsFinal,
            success: function(response) {
                $("#div-resultados").html(response.mensaje);
                $("#div-resultados").dialog({
                    draggable: false
                });
                if (!response.oK) {
                    $("#btn-actualizar-instrumentos").button("option", "disabled", false); 
                }
            },
            error: function(xhr, msg, msg2) {
                $("#div-resultados").html(xhr);
                $("#btn-actualizar-instrumentos").button("option", "disabled", false);
            },
            complete: function(e) {
                setTimeout(function() {
                    $.unblockUI();
                }, 0);
            }
        });
    }
});

ASP.NET代码:

public partial class PageClass1 : System.Web.UI.Page

{
    protected void Page_Load(object sender, EventArgs e)
    {
        var instrumentos = new List<decimal>();

        // File generation and other tasks...

        // Invocation of fire-and-forget task

        var taskQueuing = ThreadPool.QueueUserWorkItem(c => DoWork(instrumentos));

        // Building response

        mensaje += "<p>\n";
        if (taskQueuing)
        {
            mensaje += "Instrumentos procesados.<br />\n";
            mensaje += "Se le notificará por correo electrónico cuando la operación de actualización esté completa.<br />\n";
            mensaje += "Puede cerrar esta ventana ahora.<br />\n";
        }
        else
        {
            mensaje += "Error al enviar instrumentos:\n";
        }
        mensaje += "</p>\n";
        // JSONing response
        Response.StatusCode = 200;
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "application/json";
        Response.Write(textoRespuesta);
        Response.Close();
    }

    private void DoWork(List<decimal> lista)
    {
        // Invoking SSIS package
    }
}

我该如何解决这个问题?

提前致谢。

0 个答案:

没有答案