2013-06-03 94 views
2

我有一個龐大的數據運行,這需要很多時間,所以認爲線程可能很快爲我完成這項工作。Asp.net - 多線程C#

我做的:從ASP.NET前端和處理調用SQL存儲過程發生存在,它需要近30個小時。

我需要的是:我已經將數據分成不同的批次,併爲每個批次創建了相應的SP。現在我需要所有的SP在同一時間點擊一下按鈕。

請幫忙!

我用下面的代碼,但它似乎並行運行。

protected void Button3_Click(object sender, EventArgs e) 
    { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 

     t1.Start(); 
     t2.Start(); 

     t1.Join(); 
     t2.Join(); 

    } 
    void Method1() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      Response.Write("hello1"+i); 
      Response.Write("<br>"); 
     } 
    } 

    void Method2() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      Response.Write("hello2" + i); 

     } 
    } 
+4

ASP.Net管道在單線程中運行,一旦完成最終渲染就死掉。基本上,這意味着頁面在服務器上保持活動狀態,但是爲每個請求實例化頁面,用於生成生成的html,然後發佈。繼續之前,請閱讀文檔以瞭解此模型。有解決方案(signalR + out-of-iis應用程序),但你應該知道asp.net如何在一般情況下工作。 –

+0

當你調用't1.Join'時,你告訴當前線程要等到t1完成,這就是爲什麼代碼沒有並行運行的原因。 – stuartd

+0

將20,000個事情寫入ASP.NET頁面?你不想分頁嗎? –

回答

5

您可能不想直接在ASP.NET中執行此操作,原因很多,例如工作進程的執行時間有限。

還要注意的是SqlConnection等也有自己的時間限制。

你真正應該做的是排隊通過隊列的工作要做(IPC使用或其他數據庫表等),並有像Windows服務或外部進程中計劃任務拿起和過程。

地獄,你甚至可以在SQL Server中啓動一項工作,並直接完成這項工作。

+0

感謝@Lloyd的回覆。您能否給我推薦一些博客文章或任何文章,以獲得您給我的解決方案? –

1
  • 線程犯規神奇地加快你的進程。
  • 如果你不知道你在做什麼,服務器端線程通常不是一個好主意。
  • 的SQL Server可能會超時爲30小時:)

30小時工作的Asp.net是不是要走的路。這是一個很大的過程,你不應該在Asp.net中處理它。作爲替代方案,您可能需要編寫一個Windows服務。將你的參數傳遞給它(也許使用msmq或某種消息傳遞系統)執行你的過程併發送進度到Web應用程序,用signalR或Ajax拉來顯示它。

1

Narendran,從這裏開始:

http://www.albahari.com/threading/

這是最好的線程教程,我已經在網上看到和相應的書也很不錯。

確保你花足夠的時間去通過整個教程(我已經做到了,相信我,它值得的!)。

如上所述,在這種情況下使用線程類的Join方法會破壞使用線程的目的。而不是使用聯合使用鎖(請參閱上述教程中的基本Synchoronization)以確保線程同步。

同樣如前所述,在執行多線程之前,直接在SQL Server上運行這些存儲過程並將它們一起運行。如果它們還需要30個小時才能執行,那麼使用線程將不會有任何幫助。如果你看不到30個小時,那麼你可能會從多線程中受益。