2013-08-23 26 views
0

我是新的多線程,我試圖在線程結束時調用簡單的警報按鈕。這是我的代碼...請讓我知道這是什麼問題,因爲它不工作。在線程結束時向ASP.NET發送消息

public static void RunUpload() 
{ 
    Thread thread = new Thread(RunUploadOnThread); 
    thread.Start(); 

    while(thread.IsAlive) 
    {   
     Show("Rate upload in progress."); 
    } 

    Show("Rate upload completed."); 
} 

Show()只是把網頁上的信息:

public static void Show(string message) 
{ 
    string cleanMessage = message.Replace("'", "\'"); 
    Page page = HttpContext.Current.CurrentHandler as Page; 
    string script = string.Format("alert('{0}');", cleanMessage); 

    if (page != null && 
     !page.ClientScript.IsClientScriptBlockRegistered("alert")) 
    { 
     page.ClientScript.RegisterClientScriptBlock(
      page.GetType(), "alert", script, true /* addScriptTags */); 
    } 
} 
+0

你得到了什麼錯誤? – Vandesh

+0

'thread.Join();'會等到線程結束(但也阻止你的UI :))。 – I4V

+0

我沒有收到任何錯誤,我想要的只是在alert中顯示消息。 – user2123852

回答

0

要啓動線程,然後略低於檢查,如果它是活的就行了。

由於this property告訴我們線程是否已經啓動 - 這是您的代碼中的競態條件。有時它可能有效,但有時不取決於線程調度程序是否很快啓動它。

我建議發佈線程已經從工作線程本身開始的通知。

如果你使用的是.NET 4 +,你可以使用類似於任務並行庫的東西,使得更好的代碼。

然後您可以通知它已完成作爲延續。否則,將通知作爲工作線程的一行代碼發佈。

2

考慮你的頁面正在做什麼。當瀏覽器請求進入時,它會啓動一個新的線程並循環,直到它完成(但並不可靠 - 您使用的IsAlive具有競爭條件,正如h。alex指出的那樣)。循環完成時,它將數據發送到瀏覽器,該瀏覽器可以顯示警報框。所以即使你創建了一個新線程,你也沒有達到任何並行性。事實上,由於你的第一個線程正忙於等待IsAlive,它實際上比你剛剛同步完成工作時性能更差。

您需要完成初始頁面請求並讓瀏覽器向服務器請求更新。通常,您會返回某種可以傳遞給Web服務以獲取更新的令牌。

最後,您通常不希望在ASP.Net中顯式分配新線程。如果您使用ThreadPool,那麼在負載情況下,您將獲得更好的整體性能。

相關問題