2013-03-15 149 views
0

我有執行長處理的頁面(寫一些PDF的地方),所以我有以下幾點:長處理線程異步ASP.NET網頁

我ArchiveDoc.aspx頁: (頁已經在頁面指令一個標籤(稱爲進度)和異步=「真」)

delegate void archiveFuncDelegate(int idTurnover, string serverMapPath); 
delegate void UpdateUIDelegate(string Text); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Page.AddOnPreRenderCompleteAsync(BeginTask, EndTask); 
    this.progress.Text = "0"; 
} 

private void UpdateUI(string Text) 
{ 
    this.progress.Text = Text; 
} 

private IAsyncResult BeginTask(object sender, EventArgs e, AsyncCallback cb, object state) 
{ 

    // invoke 
    archiveFuncDelegate del = asyncArchivageFacture; 
    IAsyncResult result = del.BeginInvoke(cb,null); 
    return result; 
} 

private void EndTask(IAsyncResult ar) 
{ 
    if (!ar.IsCompleted) 
    { 
     progress.Text = "Error"; 
    } 
    else 
    { 
     progress.Text = "OK"; 
    } 
} 

#region Archive (thread) 

// long processing task (exemple) 
public void asyncArchivageFacture() 
{ 
    // exemple 
    int total = 101; 
    int progress = 0; 

    for(int i=0; i<total; i++) 
    { 
     progress = i*100/total; 
     updateUi.Invoke(progress + "%"); 
     Thread.Sleep(2000); 
    } 

} 

#endregion 

當我把我的頁面,該線程調用(asyncArchivageFacture()還有UpdateUI()),但網頁永遠不會得到更新:我在瀏覽器中得到了一個空白頁面的加載符號,並且一旦線程完成,該頁面最後顯示'OK'。它不顯示進度(10%.. 20%..)

任何想法有什麼不對? 謝謝!

+1

HTTP是無狀態的。您需要一個ajax組件來輪詢進度。或者,看看SignalR。 – 2013-03-15 10:35:03

回答

1

這是因爲響應(html)僅在調用EndTask方法後才發送給客戶端。無論您對進度做出什麼樣的改變,文本都在服務器端,您只需更改服務器端變量。

+0

所以,你說我應該從asyncArchivageFacture()開始另一個線程,以便asyncArchivageFacture()立即返回? – TGI 2013-03-15 10:40:16

+0

正如David Tryon所指出的那樣,由於http是無狀態的,所以你不能將結果發送回客戶端。客戶端(瀏覽器/移動設備)請求此頁面並期待響應(本例中爲html)。直到發生(或發生錯誤),Tcp連接將由客戶端保持活動狀態。您可以使用Ajax調用在客戶端顯示進度,方法是重複向服務器詢問進度。總之,你的問題的答案是否定的。你不能通過啓動另一個線程來實現它。你應該使用重複的Ajax調用 – guruprasath 2013-03-15 10:45:03

+0

我不明白,如果頁面等待EndTask()(即線程)完成,那麼異步方面在哪裏?它是阻塞的,而不是異步的,然後.. – TGI 2013-03-15 14:22:32

0

最後我用一個簡單的

線程t =新主題(..)

沒有delaring頁面異步=真。