2014-02-19 65 views
2

我有一個是在生產運作良好的應用程序,但我不知道如果我能實現的併發更好....線程VS TPL VS異步委託在ASP.NET

ASP.NET .NET 4, C#

基本上,它會在運行中生成n個sql語句(目前大約爲50個),然後同時運行它們並將數據寫入.csv文件。

編輯:首先我創建一個線程來完成所有的工作,以便頁面請求可以返回。然後在該線程上...

對於每個SQL語句,我使用TPL創建一個新的Task,並使用DataReader執行它並將數據寫入磁盤。當創建最後一個文件時,我會將一些摘要數據寫入摘要文件並將其全部壓縮並提供給用戶。

我是否應該使用線程或異步代理?

我沒有發佈代碼,因爲我真的只是想知道我的整體方法(即TPL)是否是這種情況下的最佳選擇。

請不要教我關於創建動態sql,這是完全必要的,由於我閱讀的數據庫的技術性和與問題無關。 (它是專有系統的後端,擁有7000多張桌子)。

+0

在對代碼進行任何更改之前,請確保您瞭解異步和多線程/多任務之間的區別。他們是不一樣的,你可能應該在你的情況下結合起來。 – MarcinJuraszek

+0

在ASP.NET中執行'Task.Run'或'Task.Factory.StartNew'確實是一個糟糕的主意。在所有任務完成之前,HTTP請求將不會完成。你真的只會因此而傷害Web應用程序的可伸縮性。使用[異步SqlDataReader API](http://blogs.msdn.com/b/adonet/archive/2012/07/15/using-sqldatareader-s-new-async-methods-in-net-4-5-beta而是使用-part-2-examples.aspx)。 – Noseratio

+0

@MarcinJuraszek我想我明白了兩個概念之間的區別。 :)你能否詳細說明一下?好處?所以也許在datareader上調用一些異步方法(沒有檢查是否有)。當我提到異步委託時,我想也許我應該做了一堆異步回調,每個sql查詢/寫一個,當它完成它壓縮.... – user2416689

回答

0

我應該使用線程還是異步代理?

顯然,您的後臺線程操作跨越單個HTTP請求的邊界。在這種情況下,使用什麼API來運行此類操作並不重要:Task.Run,Delegate.BeginInvoke,ThreadPool.QueueUserWorkItem,new Thread或其他任何內容。

您不應該在ASP.NET地址空間內運行冗長的後臺線程操作,該操作會跨越多個HTTP請求。儘管實現起來相對容易,但這種方法可能會對IIS的可維護性,可伸縮性和安全性產生影響。爲此創建一個WCF服務,並從ASP.NET頁面調用它:

How to: Host a WCF Service in a Managed Windows Service

0

如果我們從服務於http請求的線程在ASP.Net中啓動一個新線程,並且新線程有未處理的異常,那麼工作進程將立即崩潰。即使我們使用WCF服務並從ASP.Net調用ASP.Net線程將等待結果。因此,最好使用任何排隊機制,以便請求處於隊列中,隊列可以根據處理能力在不同的時間進行處理。當然,當我們說排隊時,我們需要考慮隊列失敗,請求等等。但是,如果應用程序很大並且需要擴展,它的價值就很大。