2009-08-04 36 views
1

對於使用.NET的新Web應用程序項目,現有庫(用C#編寫)將在線提供,該庫對數據模型中的信息執行一些計算。我可以在多用戶.NET Web應用程序中使用非線程安全庫嗎?

庫需要由許多用戶在同一時間訪問。每個用戶將使用一組不同的數據。用戶還可以修改模型數據並使用修改的輸入參數重複計算。

目前,庫一次只能處理一個數據模型。 (讓我們假設有像靜態類和單例那樣的設計問題)。

如果.NET Web應用程序(使用HTML網頁的簡單Web前端)想要使用此庫,是否有技術可以爲每個客戶端創建單獨的庫實例,以保持模型和其他參數分開嗎?

+0

你的用戶需要在同一時間用不同的模型數據的工作,但你的庫只能同時處理一個模型的數據?你說什麼意味着它是不可能的,該庫中是否只有靜態類?我們在談什麼圖書館? – 2009-08-04 07:45:42

+0

讓我們假設有像靜態類或單例那樣的設計問題無法快速解決。 – mjn 2009-08-04 08:17:38

回答

1

您可以在外部加載模塊並每次創建一個新實例或使用.NET Enterprise Services(COM +)使用對象池,但如果對象是有狀態的,您仍然會遇到可伸縮性問題。

每個評論:是的,你可以。查看this example,快速入門。

+0

非常感謝您的鏈接,COM +對象池是一個非常有趣的選項 – mjn 2009-08-04 07:51:55

+0

您是否知道我是否可以在ASP.NET應用程序中使用COM +對象池? – mjn 2009-08-04 08:19:32

0

如果您想您的用戶asp.net應用程序實例中共享一個單獨的對象,它需要與線程安全執行任何種類的訪問和修改。

您可以使用和管理庫的情況下創建一個包裝。

+0

圖書館目前說'像對待單身人士一樣對待我',但Web應用程序想要用不同的狀態創建它的許多實例。基本的問題是如何創建庫的許多實例並將Web客戶機會話綁定到一個庫實例。 – mjn 2009-08-04 07:56:12

0

您可以使用鎖定,例如:

lock (typeof(YOUR_MODEL_CLASS)) 
{ 
} 

或嘗試和隊列計算,參數保存到數據庫文件,並通過有一個服務運行,但每次計算在自己的時間。

會有一個門檻,這將是穩定/可用。

+0

加載模型可能需要一分鐘,完成後用戶需要以交互方式使用它。排隊/負載平衡是一個好主意,但在這種情況下,客戶端請求與其數據集之間的切換需要很長時間。 – mjn 2009-08-04 07:49:54

0

大多數類的.NET Framework不爲多線程訪問做,因爲你可以在MSDN看到。

如果你說,你的用戶提供不同的數據集工作,所以你的程序需要在庫中爲每個用戶創建類的實例 - 這聽起來沒有問題給我。

批判會是,如果許多用戶會在同一組數據的工作,那麼你就必須關心圖書館的多線程能力。

0

如果你談論的是那些沒有設置要在那麼多線程環境中,答案是肯定安全的一個組成部分。但是,您必須選擇一種「同步」訪問組件的機制。 C#中最簡單的形式是「鎖定」語法。

如果你是在談論一個組件,它允許一個單一實例在同一時間才把答案是否定的。這是因爲Web應用程序本質上是多線程的。在asp.net中使用它需要你鎖定整個服務器,等待組件完成,這通常是一件壞事。 我最好的解決方案是使這種組件成爲異步操作。允許用戶指定輸入參數,然後將這些數據保存到某個位置,並使用某種調度程序一次處理一個數據。當過程完成時,通知用戶工作已完成等。

另外,當組件花費大量時間來處理時,最好不要讓用戶同步地與組件進行交互。

相關問題