簡體   English   中英

asp.net C#ajax運行'async'批處理作業

[英]asp.net C# ajax running 'async' batch job

我對asp.net和C#都很陌生,所以請耐心等待。 如果之前有人問過,我也很抱歉...如果是這樣,請指導我到一個有幫助的頁面。

是)我有的:

  • 頁面:有4個updatepanels

    1. 第一個UpdatePanel,包含(項目)gridview,用戶顯示選項(對此問題不重要)和執行數據庫搜索的按鈕,該數據庫搜索返回顯示到網格的項目列表。 用戶選擇此網格上的項目...

    2. 2nd UpdatePanel包含一個下拉列表,其中包含從XML加載的可用任務列表。 用戶將選擇一個任務,該任務在第二個更新面板中顯示一堆可用選項/參數(也從XML文件加載)到另一個(參數)gridview。 Gridview在這里總是有一行數據。 我在這里使用gridview是因為它更容易而不是創建動態控件(參數不同於每個任務)。 用戶可以在網格中輸入參數值。 用戶單擊“添加”按鈕,該任務將添加到第3個更新面板中的另一個網格視圖中。

    3. 3rd UpdatePanel包含一個(任務)gridview,其中包含用戶添加的所有任務。 還有一個按鈕,可以批量運行所有任務。 單擊該按鈕時,它將通過(任務)gridview查找要運行的待處理任務。 對於每個掛起的任務,它調用一個適當處理任務的Web服務。 Web服務將任務結果與日志輸出一起返回。

    4. 4th UpdatedPanel現在只包含一個顯示從Web服務返回的日志輸出的div。

我想進一步研究,不知道如何:

  • 如何執行“異步”批處理作業? 我想要實現的是,當用戶點擊批量運行按鈕時,第3個(任務)更新面板及其所有控件將被禁用,而批處理作業將在“幕后”運行。 根據任務的不同,每項任務最多可能需要5秒。 如果用戶創建了60個任務,我認為這也會導致頁面超時?
  • 在批處理作業運行時,用戶可以進一步搜索(項目)UpdatePanel中的其他項目,並使用(參數)updatepanel向(任務)更新面板添加新任務。
  • (任務)UpdatePanel將在作業運行時顯示某種“正在進行的作業...”覆蓋。

希望你理解我的問題。 如果有人能夠對如何解決這項任務提供一些指導和/或指導,我們非常感激

更多信息:

使用Framework 3.5

使用Asp.net C#+ Ajax

Web服務是solaris盒子上的gSoap

提前謝謝了。


很抱歉作為一個菜鳥,我試圖回復你的幫助,但發現我可以放入一些有限的角色。我現在只更新自己的評論。

謝謝你的建議。 對於遲到的回復感到抱歉,我前幾天一直在尋找並做了一些修改,讓它與'PageAsyncTask'和'IAsyncResult'一起工作。 我已經創建了一個將由頁面調用的Web服務類。 新的Web服務類將調用gSoap Web服務。 我設法以某種方式'異步'運行它。

我有一個按鈕執行:

  protected void StartASyncJob()
  {
     PageAsyncTask task = new PageAsyncTask(
        new BeginEventHandler(BeginAsyncCommandTask),
        new EndEventHandler(EndAsyncCommandTask),
        new EndEventHandler(AsyncCommandTaskTimeOut), null);

     RegisterAsyncTask(task);
  }

BeginAsyncCommandTask將遍歷網格,獲取第一個待處理任務並調用Web服務。

然后,EndAsyncCommandTask將檢索返回結果,寫出(log)UpdatePanel。 然后它將再次執行StartASyncJob(),查找要處理的下一個待處理記錄。

只有在頁面上不做任何其他操作時,所有這一切才有效。 如果我(在異步進程運行時)在(項目)gridview中搜索更多項目或從(任務)下拉列表中選擇新任務,則事件將不會觸發,直到異步Web服務進程完成。 當它完成后,下拉列表或搜索事件將觸發,我的Web服務返回的日志詳細信息不會更新。

我想'等待'是由'PageAsyncTask'從同一頁面線程'生成'引起的?

我原以為讓“異步”Web服務能夠讓用戶一次做多件事,從而提供更好的用戶體驗。 但似乎我錯了和/或沒有做對。

我還沒有嘗試過使用QueueUserWorkItem的建議; 但在此之前,請問它是否會產生與使用'PageAsyncTask'相同的效果。 使用QueueUserWorkItem會產生“從同一頁面線程產生”的相同效果嗎?

提前謝謝了。 對不起,如果我沒有很好地解釋自己,如果您需要我發布我的代碼,請告訴我。

有一些解決方案,但取決於您在服務器上的控制程度。

  1. 如果您對服務器具有完全訪問控制權,則可以創建一個單獨的應用程序來處理任務; 應用程序可以是Windows服務,頁面和應用程序之間的通信可以是數據庫或MSMMQ(通信主要是指任務列表及其狀態 - 1.執行,2。執行3.完成)。

  2. 另一種解決方案是,如果您沒有對服務器的完全訪問控制,但它需要在線程之間實現一些通信。 而不是我在第1點描述的應用程序,你可以有一個單獨的線程,可以這樣開始:

     System.Threading.ThreadPool.QueueUserWorkItem(foo => LauchTaskRunner()); 

    假設您實現了一個名為LaunchTaskRunner的方法,該方法在循環中只處理現有任務列表,上面的行將把它啟動到一個單獨的進程中。 您可以通過一些靜態變量(在頁面中聲明)與此方法(在單獨的線程中運行)進行通信,例如:

     public class YourPage : System.Web.UI.Page{ static IList<Task> tasks; static void LauchTaskRunner(){ // here make use of tasks variable } } 

    每次(任務)updatepanel刷新時,它都應該基於任務變量進行渲染。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM