2012-01-13 38 views
0

此刻,我的項目有一個方法如何從.Net中的線程向瀏覽器發送通知?

do_quote(quoteid,userid) 

這種方法需要一兩分鐘,然後重定向到另一個頁面。

這已被重寫,以便它現在在後臺運行並重定向到另一個頁面,同時繼續執行do_quote的線程。 - 這工作正常。

在一個Default.aspx頁面,一個button_click事件:

Dim d as New do_quote_delegate(AddressOf do_quote) 
d.BeginInvoke(quoteid,userid, New AsyncCallback(AddressOf Callback),d) 
Response.redirect("results.aspx") 

內容涉及

Delegate Sub do_quote_delegate(Byval quoteid as integer, Byval userid as integer) 

Public Sub do_quote(Byval quoteid as integer, Byval userid as integer) 
    ' Do something for several seconds 
End Sub 

Public Sub Callback(Byval ar As IAsyncResult) 
    ar.AsyncState.EndInvoke(ar) 
    ' i think i need something here to trigger a notification 
End Sub 

這基本上我想要做什麼,用戶可以繼續在網站上做的事情, do_quote方法在後臺運行併成功完成其任務。

我想在do_quote完成時向瀏覽器發送通知。理想情況下,我想改變主頁上div的文本(但只是返回一個ALERT JavaScript msgbox將是一個開始)。

據我所知,回調在過程結束時被調用,所以我認爲這將是一個理想的地方發送javascript到瀏覽器,但我不能想我該如何實現這一點。當過程結束時調用回調方法時,有沒有人有任何想法可以實現一個非常基本的通知(msgbox,response.write等)到瀏覽器?謝謝

回答

1

我認爲你需要顛倒過程流程的控制,因爲我不認爲有任何方法可以從Web服務器推回到Web瀏覽器。

爲我們處理長期運行的事務一樣,這是如下方式的大致輪廓:

啓動Web服務器上的過程中,無論是通過回發或ajax請求。

Web服務器爲請求生成一個唯一標識符,並觸發後臺工作人員或線程,或者在數據庫表中爲隊列請求排隊並處理服務。

如果啓動了後臺工作者或線程,則該請求的唯一標識符會記錄在應用程序中的某個位置,通常位於數據庫中以確保它在Web場或Web園中可用(而不是將其存儲在緩存或靜態變量中)。

一旦啓動過程,Web服務器會將唯一ID返回給瀏覽器。

然後瀏覽器設置一個window.timeout循環,通過ajax調用或PageMethod定期檢查請求的狀態。

當過程完成後,無論成功還是失敗,它更新與可能已產生的任何錯誤消息一起在唯一的ID原來拍攝的(再次,通常是一個數據庫表)的位置狀態。

下一次客戶機超時火災,它會發現過程已經完成,然後可以執行相應的操作(導航至不同的頁面,顯示錯誤消息,等等)。

我們已經成功地將這種模式用於幾個長時間運行的活動,包括報告生成和數據合併。

相關問題