[英]asp.net C# ajax running 'async' batch job
我對asp.net和C#都很陌生,所以請耐心等待。 如果之前有人問過,我也很抱歉...如果是這樣,請指導我到一個有幫助的頁面。
是)我有的:
頁面:有4個updatepanels
第一個UpdatePanel,包含(項目)gridview,用戶顯示選項(對此問題不重要)和執行數據庫搜索的按鈕,該數據庫搜索返回顯示到網格的項目列表。 用戶選擇此網格上的項目...
2nd UpdatePanel包含一個下拉列表,其中包含從XML加載的可用任務列表。 用戶將選擇一個任務,該任務在第二個更新面板中顯示一堆可用選項/參數(也從XML文件加載)到另一個(參數)gridview。 Gridview在這里總是有一行數據。 我在這里使用gridview是因為它更容易而不是創建動態控件(參數不同於每個任務)。 用戶可以在網格中輸入參數值。 用戶單擊“添加”按鈕,該任務將添加到第3個更新面板中的另一個網格視圖中。
3rd UpdatePanel包含一個(任務)gridview,其中包含用戶添加的所有任務。 還有一個按鈕,可以批量運行所有任務。 單擊該按鈕時,它將通過(任務)gridview查找要運行的待處理任務。 對於每個掛起的任務,它調用一個適當處理任務的Web服務。 Web服務將任務結果與日志輸出一起返回。
4th UpdatedPanel現在只包含一個顯示從Web服務返回的日志輸出的div。
我想進一步研究,不知道如何:
希望你理解我的問題。 如果有人能夠對如何解決這項任務提供一些指導和/或指導,我們非常感激
更多信息:
使用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會產生“從同一頁面線程產生”的相同效果嗎?
提前謝謝了。 對不起,如果我沒有很好地解釋自己,如果您需要我發布我的代碼,請告訴我。
有一些解決方案,但取決於您在服務器上的控制程度。
如果您對服務器具有完全訪問控制權,則可以創建一個單獨的應用程序來處理任務; 應用程序可以是Windows服務,頁面和應用程序之間的通信可以是數據庫或MSMMQ(通信主要是指任務列表及其狀態 - 1.執行,2。執行3.完成)。
另一種解決方案是,如果您沒有對服務器的完全訪問控制,但它需要在線程之間實現一些通信。 而不是我在第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.