簡體   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