2011-05-28 71 views
0

我有一個執行長時間運行任務的asp.net頁面。所以我在一個單獨的線程中執行任務並定期輪詢頁面以檢查狀態。從後臺線程訪問SessionState

public partial class ResultPage : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(delegate() 
     { 
     ProcessItems(parameters); 
     })); 
     t.Name = "ThreadInfoPathProcess"; 
     t.Priority = ThreadPriority.Normal; 
     t.Start(); 
    } 

    private void ProcessItems(Parameters params) 
    { 
     // 
     //some code 
     // 

     //save the result in session and take it from another page 
     lock (this.Session.SyncRoot) 
     this.Session[resultid] = result; 
    } 
} 

但是當我從其他頁面訪問會話時,我將會話變量設置爲空。這裏可能是什麼問題?

+0

頁面調用的順序是什麼? – oleksii 2011-05-28 11:44:33

+0

該頁面有一個asp定時器控件,該控件返回頁面並檢查線程的狀態。線程從頁面開始並將結果更新爲會話狀態。在timer_tick中,我檢查線程是否已完成運行,並重定向到另一頁。從新頁面讀取會話狀態以獲得線程給出的結果並對其進行處理。 – NLV 2011-05-28 11:50:07

回答

2

正確的方法是創建Windows服務,您將通過遠程調用Web應用程序(WCF - 可以是本地通過命名管道)安排您的長時間運行的進程。然後你的計時器將把這個頁面合併到一起,這個頁面可以將Windows服務池或者檢查一些狀態記錄與數據庫中的結果進行比較。