2012-01-17 64 views
1

我想在我的asp.net mvc 2應用程序中具有並行功能。我在我的視圖中以表格格式加載了一個ip地址列表。我想看看它們是否可以ping通。所以我在jQuery.ajax()的幫助下爲每個ip地址啓動了控制器上的GetStatus(string ip)動作。我可以在螢火蟲中看到所有請求都已經啓動。但在log4net日誌的服務器端,我可以看到這些請求以順序方式執行。是asp.net mvc操作是單用戶嗎?

所以我這裏有

  • 2分的問題是asp.net mvc的行動是單個用戶?這意味着如果一個動作被多個用戶調用,那麼這個特定動作是否會針對每個用戶逐一執行,而不是由asp.net或IIS創建的單獨(神奇)線程執行?

  • 由於ping是網絡操作,我應該如何使它並行。

我在asp.net上工作,但這方面對我來說似乎是新的。在這方面任何具體的資源是最受歡迎的。

編輯:我正在Asp.Net MVC 2

回答

2

,如果你在你的動作中使用的會話會發生這種情況。由於會話不是線程安全的,ASP.NET會序列化對它們的訪問。因此,如果您對來自同一會話的同一操作有兩個並行請求(這是AJAX請求的情況),並且如果此操作寫入ASP.NET會話,那麼這兩個請求將按順序排隊並執行。

如果您在web.config(<sessionState mode="Off" />)中禁用了會話,或者您爲給定的控制器禁用了會話,則將不再按順序處理請求,而是並行處理請求。當然這意味着這個控制器要麼根本不使用會話,要麼只用於只讀。見[SessionState]屬性:

[SessionState(SessionStateBehavior.ReadOnly)] 
public class HomeController: Controller 
{ 
    // actions in this controller can be processed in parallel 
    // for requests from the same session 
} 
+0

如果asp.net序列化訪問會話,是否意味着會話是線程安全的? – fengd 2012-01-17 14:29:50

+0

@ Jun1st,不,這正是因爲會話**不是線程安全的** ASP.NET會鎖定請求,並且一次只允許給定會話的一個請求執行。請記住,只有當您爲同一個會話發送2個並行請求時纔會發生這種情況。兩個單獨的用戶(具有單獨的會話)同時發送並行請求到同一個動作將被並行執行而沒有任何鎖定。 – 2012-01-17 14:30:35

+0

@DarinDimitrov,我正在寫入會話在索引操作中,只在GetStatus()操作中進行讀取操作。但從SessionState屬性看來,它只能用於Class。您認爲應該如何通過會話訪問來實現這種並行性? – Codie 2012-01-17 14:42:20

0

不,它不是單個用戶。 asp.net webform/mvc將創建一個新的線程來處理新的請求。兩個不同的請求在同一時間將有兩個線程。

log4net將緩衝任何日誌請求,並一次刷新全部內容。你根本不能在一行寫兩句話。

+0

不知道有關log4net緩衝,但每條語句都有正確的時間戳。從時間戳我可以說這個動作是順序執行的。 @Darin說,這對我更有意義。 – Codie 2012-01-17 14:38:30