asp.net ajax长时间运行的进程没有响应客户端
我在asp.net/ajax调用中有一个长时间运行的进程。在流程结束时,我将结果分配给一个标签,但在流程结束时,服务器似乎无法再分配给标签(好像响应在流程结束前已发送) 我正在使用updatepanel来管理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
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服务中。然后我轮询以确定进程何时完成,从而在客户端上显示结果。