2012-02-27 111 views
0

我有一個長期運行的任務,我需要在網頁上實現。我想要做的是在一個單獨的線程上運行任務,但在網頁上有一個進度條。asp.net異步線程與pooling

我正在努力尋找一個簡單的方法來做到這一點。這是一個非常簡單的例子,我想這樣做。基本上,我想要一個線程中的ResetAll(),並將變量y存儲起來以更新網頁UI。

有人可以幫助我嗎?

Protected Sub btnReset_Click(sender As Object, e As System.EventArgs) Handles btnResetLowConductor.Click 
    ResetAll() 
End Sub 

Private Sub ResetAll() 
    Dim y As Integer = 0 
    While y < x 
     y += 1 
     Reset() 
     lblProgress.Text = y & "/" & x 
    End While 
End Sub 


Private Sub Reset() 
    Threading.Thread.Sleep(200) 
End Sub 
+1

什麼版本的.Net? – 2012-02-27 15:56:32

+0

使用asp.net 3.5 – jagdipa 2012-02-27 16:02:13

回答

1

只要線程還活着,您的lblProgress將不會更新。您將只獲得最終值y & x即當線程死亡時。您可以將Y & X的值存儲在會話變量中。

Private Sub ResetAll() 
    Dim y As Integer = 0 
    While y < x 
     y += 1 
     Reset() 
     Session("CurrentStatus") = y & "/" & x 

    End While 
End Sub 

從你的UI,你會用火異步事件PageMethod的即

function GetCurrentThreadStatus() 
{ 
     PageMethods.GetThreadStatus(function(status){ 
      // success 
      $("span[id*='lblProgress']").text(status); 
     }); 
} 

代碼背後:C#

[WebMethod] 
public static string GetThreadStatus() 
{ 
    return (string)Session["CurrentStatus"]; 
} 
0

由於這是一個網站,你可能會需要使用一些定期調用回服務器的一種ajax方法。這裏是你的程序的基本流程,據我可以看到它:

  • 用戶進行初始呼叫
  • 旋轉了新的線程來運行程序,並用0%的狀態回到
  • 定期,使通過AJAX(A的getStatus調用,將返回完成的百分比)
    • 如果通話結束,更新調用Web服務器/刷新頁面適當
    • 如果呼叫未完成,則使用返回狀態
    • 現在

,我不是肯定考慮到這是一個網頁的細節,但你可以嘗試以存儲在會話變量的狀態(可一旦你已經或可能無法定期返回),然後GetStatus將只讀取最新的狀態。如果會話不起作用,那麼你將需要以另一種方式(數據庫,文件等)保持狀態。

只要注意您存儲狀態的頻率。太頻繁,你放慢了你的過程,太少了,你不能準確地表示狀態。

最後,如果你可以升級到.NET 4.0,那麼這個就更加微不足道使用TPL(任務並行庫)

0

你感到困惑的網頁是如何工作的。

一旦線程被觸發並且您將響應寫入客戶端,您將無法在線程前進時繼續更新頁面。

做這種事情的一種方法是使用Ajax。烏爾哈斯已經向你展示了一個方法:所有你需要做的就是讓他寫的這個javascript函數自己調用,直到你完成100%。你可以使用定時器來做到這一點。