2012-10-26 118 views
1

我有麻煩了。在我的web應用程序,我有創建一個按鈕的Click事件線程來執行數據密集型任務的代碼中,是這樣的:C#Web應用程序線程

protected void button_Click(object sender, EventArgs e) 
{ 
    // Show loader image 
    loader.Show(); 

    // Creating the thread 
    System.Threading.ParameterizedThreadStart ts = new System.Threading.ParameterizedThreadStart(RunThread); 
    Thread t = new Thread(ts); 
    t.Name = "BackgroundThread"; 
    t.Priority = ThreadPriority.AboveNormal; 
    t.Start(HttpContext.Current); 
} 
private void RunThread(object state) 
{ 
    // Setting the current thread property as the background thread 
    CurrentThread = Thread.CurrentThread; 

    if (IsThreadRunning(CurrentThread)) 
    { 
     CurrentThread.Join(TimeSpan.FromMinutes(6d)); 
    } 

    // DO SOME HEAVY STUFF 
} 

在點擊該按鈕i顯示了裝載機。問題是:即使呼叫加入BackgroundThread,Page_Load事件被頻繁調用,使頁面刷新。換句話說,雖然RunThread沒有完成,Page_Load正在調用。我可以防止這種情況發生嗎?

OBS:我想要做的是:在數據密集型線程運行時顯示加載器,而不在頁面上進行重複刷新。

+1

不要調用'page_load'的高優先級線程嗎?如果你解釋這個試圖解決什麼問題,也許可以提供一個更好的選擇。 – Oded

+0

請讓你的問題更清楚,你想做什麼? – Anri

+0

你爲什麼要在當前線程上調用'Join'?這是一個毫無意義的操作。 –

回答

1

從網頁檢查長時間運行的任務狀態而不進行輪詢(不定時回發)的唯一方法是使用Web套接字,但我確信使用它會對這類任務造成很大的開銷。

我會使用ajax請求來防止整個頁面重新加載。

似乎你需要閱讀更多關於整個Web請求和響應過程。

+0

簡而言之,我想在長時間運行的任務結束之前禁止將頁面送達客戶端。它就像一個長期運行的線程上的Join。但即使我打電話加入,該頁面遵循他的正常週期,並獲得送達客戶端。 –

+0

你不能在主線上做這項工作嗎?您也可能會遇到超時。 – Anri

+0

發生了一些奇怪的事情!當我將webapp部署到我公司的臨時服務器上時,上述問題(頻繁刷新)淡出。似乎只是因爲應用程序在調試模式下運行才發生。 –