繁体   English   中英

在服务器上执行作业并将用户重定向到其他页面

[英]Execute job on server and redirect user to different page

我有一个用户从我的网站运行的过程。 有时他们选择少量数据,而其他时候则选择大量数据。 我想要做的是,当用户提交作业时,它是否大量?我想开始在Web服务器上创建数据集的过程;当作业完成时,我具有检查错误的功能。 在此过程开始的同时,我想将用户重定向到另一个页面,该页面上说他们将在作业完成后收到一封电子邮件。
目前,我正在同步执行此操作,仅适用于小型工作。 大作业在firefox 30上5分钟后超时。这是我的过程代码

try
{
  Process p = new Process();
  p.StartInfo.Arguments = " -config 'C:\\temp\\Web.cfg'" ;
  p.StartInfo.CreateNoWindow = true;
  p.StartInfo.FileName = "sas.exe";
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.UseShellExecute = false;
  p.Start();
  p.WaitForExit();
  p.Close();
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}

errDesc = clsUtil.CheckErrors("test.log", "ERROR");

我对这种类型的Web编程非常陌生,所以如果我错过明显的事情,我深表歉意。

谢谢

编辑:

这是我当前正在使用的代码,它似乎可以工作。 您看到此代码有任何问题吗? 我用运行大量任务的4种浏览器对其进行了测试,提交后它们便被重定向,并且收到了我希望任务完成的电子邮件。 我是否需要处理线程?

if ((nCols > nColsMax) || (ckbEmail.Checked == true))
{
 Thread tr = new Thread(() => MakeDataThread(cartID));
 tr.Start();
 Response.Redirect("../EmailID.aspx?Email=" + Session["User"].ToString());
}

public static void MakeDataThread(int iCartID) 
{
 clsUtil uUtil = new clsUtil();
 uUtil.RunAJobThread(iCartID);
}

在uUtil.RunAJobThread中,我选择cartId并转到oracle数据库,然后选择我认为创建文档的数据,然后向用户发送电子邮件。

只要共享资源(例如文件等)的作业没有彼此重叠,您就必须谨慎进行并测试它,但是是的,您需要做的就是将方法转换为异步处理或使您的方法退出调用此过程代码的调用。

当Web请求在此新表中生成一行(例如Task)时,您可能希望创建一个db表来支持此功能。 生成一个TaskId,使用此ID更新/报告状态。

taskId将通过重定向发送回Web客户端,并且该TaskId可用于查询状态。 或者,如果这是一台服务器,或者您不想将后端放置在服务器上,则可以使用会话。

总结一下:

  • 收到要求
  • 生成TaskId(数据库或您自己的一些静态工厂)
  • 将该TaskId发送到AsyncTask,以便它可以使用它报告进度。 (这将在新线程下执行)
  • 发送带有TaskId的重定向到客户端(这几乎会立即发生。)

现在,您的客户端可以使用taskId调用页面,并且您可以在AsyncTask处理/完成时以状态回复

过去,对于从网页执行的长时间运行的流程,我要做的是:

1)将用户的数据输入值写入表格。

2)通知用户数据准备就绪时将通知他们。 当他们确认这一点时,他们将被重定向到您希望他们去的任何地方。

3)现在,您也许可以编写一个执行长时间运行的控制台应用程序。 从服务器运行控制台应用程序,但是您经常需要这样做。

4)最后,在处理数据后,通过电子邮件通知用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM