Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net ajax长时间运行的进程没有响应客户端_Asp.net_Asp.net Ajax_Ajax.net - Fatal编程技术网

asp.net ajax长时间运行的进程没有响应客户端

asp.net ajax长时间运行的进程没有响应客户端,asp.net,asp.net-ajax,ajax.net,Asp.net,Asp.net Ajax,Ajax.net,我在asp.net/ajax调用中有一个长时间运行的进程。在流程结束时,我将结果分配给一个标签,但在流程结束时,服务器似乎无法再分配给标签(好像响应在流程结束前已发送) 我正在使用updatepanel来管理ajax调用。有什么办法解决这个问题吗 private void RunFNBOMultiThreaded() { lblFNBOCalcResult.Text = ""; DAL dal = new DAL(); int month

我在asp.net/ajax调用中有一个长时间运行的进程。在流程结束时,我将结果分配给一个标签,但在流程结束时,服务器似乎无法再分配给标签(好像响应在流程结束前已发送)

我正在使用updatepanel来管理ajax调用。有什么办法解决这个问题吗

private void RunFNBOMultiThreaded()
    {
        lblFNBOCalcResult.Text = "";
        DAL dal = new DAL();
        int month = int.Parse(Request.QueryString["m"]);
        int year = int.Parse(Request.QueryString["y"]);
        if (dal.ImportExists(month, year, "fnbo"))
        {
            DataTable dt = dal.GetFNBOMIDs(month, year);
            DataTable groups = dal.GetChargeTypeGroupLookup();

            BankFNBO[] bankArray = new BankFNBO[NUMBER_OF_THREADS];
            DataTable[] dtArray = new DataTable[NUMBER_OF_THREADS];

            int division = dt.Rows.Count / NUMBER_OF_THREADS;
            int remainder = dt.Rows.Count % division;

            // split the cynergy import file into as many sections as we declare threads.
            for (int i = 0; i < NUMBER_OF_THREADS; i++)
            {
                switch (i + 1)
                {
                    case 1:
                        dtArray[i] = dt.AsEnumerable().Take(division).CopyToDataTable();
                        break;
                    case 2:
                        dtArray[i] = dt.AsEnumerable().Skip(division).Take(division).CopyToDataTable();
                        break;
                    case NUMBER_OF_THREADS:
                        // add the remainder to the last datatable. (division + remainder)
                        dtArray[i] = dt.AsEnumerable().Skip(division * i).Take(division + remainder).CopyToDataTable();
                        break;
                    default:
                        dtArray[i] = dt.AsEnumerable().Skip(division * i).Take(division).CopyToDataTable();
                        break;
                }
            }

            // One event is used for each bank object
            ManualResetEvent[] doneEvents = new ManualResetEvent[NUMBER_OF_THREADS];

            // Configure and launch threads using ThreadPool:
            for (int i = 0; i < NUMBER_OF_THREADS; i++)
            {
                doneEvents[i] = new ManualResetEvent(false);
                BankFNBO b = new BankFNBO(month, year, dtArray[i], groups, doneEvents[i]);
                bankArray[i] = b;
                ThreadPool.QueueUserWorkItem(b.ThreadPoolCallback, i);
            }

            try
            {
                // Wait for all threads in pool to calculate...
                WaitHandle.WaitAll(doneEvents);
                lblFNBOCalcResult.ForeColor = System.Drawing.Color.Green;
                lblFNBOCalcResult.Text = "Calculation was successful";
            }
            catch (Exception)
            {
                lblFNBOCalcResult.ForeColor = System.Drawing.Color.Red;
                lblFNBOCalcResult.Text = "Calculation failed";
            }
        }
    }
private void runfnbo多线程()
{
lblFNBOCalcResult.Text=“”;
DAL=新的DAL();
int month=int.Parse(Request.QueryString[“m”]);
int year=int.Parse(Request.QueryString[“y”]);
if(dal.进口国(月、年,“fnbo”))
{
数据表dt=dal.GetFNBOMIDs(月、年);
DataTable groups=dal.GetChargeTypeGroupLookup();
BankFNBO[]bankArray=新BankFNBO[线程数];
DataTable[]dtArray=新DataTable[线程数];
int division=dt.Rows.Count/线程数;
整数余数=dt.Rows.Count%除法;
//将cynergy导入文件拆分为我们声明线程的尽可能多的部分。
for(int i=0;i<线程数;i++)
{
开关(i+1)
{
案例1:
dtArray[i]=dt.AsEnumerable().Take(division.CopyToDataTable();
打破
案例2:
dtArray[i]=dt.AsEnumerable().Skip(除法).Take(除法).CopyToDataTable();
打破
_线程的案例编号_:
//将余数添加到最后一个数据表中。(除法+余数)
dtArray[i]=dt.AsEnumerable().Skip(除法*i).Take(除法+余数).CopyToDataTable();
打破
违约:
dtArray[i]=dt.AsEnumerable().Skip(除法*i).Take(除法).CopyToDataTable();
打破
}
}
//每个银行对象使用一个事件
ManualResetEvent[]DoneeEvents=新的ManualResetEvent[螺纹数];
//使用线程池配置和启动线程:
for(int i=0;i<线程数;i++)
{
doneEvents[i]=新的手动重置事件(false);
BankFNBO b=新的BankFNBO(月、年、数据数组[i]、组、事件[i]);
bankArray[i]=b;
QueueUserWorkItem(b.ThreadPoolCallback,i);
}
尝试
{
//等待池中的所有线程计算。。。
WaitHandle.WaitAll(doneEvents);
lblFNBOCalcResult.ForeColor=System.Drawing.Color.Green;
lblFNBOCalcResult.Text=“计算成功”;
}
捕获(例外)
{
lblFNBOCalcResult.ForeColor=System.Drawing.Color.Red;
lblFNBOCalcResult.Text=“计算失败”;
}
}
}

您是否尝试过只更新标签,即注释掉所有其他代码?如果执行此任务需要很长时间,则此代码应位于windows服务或某种任务系统中。我认为Asp.Net不应该在一个请求过程中做那么多的工作。唯一的问题是如何在过程完成时通知。我可能能够勉强通过要求并通过电子邮件通知。来了解一下从生产服务器运行该过程只需1-2分钟,这对我来说似乎是公司内部工具可以接受的。然而,我采纳了一些建议,并将这个过程放到了一个web服务中。然后我轮询以确定进程何时完成,从而在客户端上显示结果。